c++ - 减少 "const char*"和 "const std::string&"参数的重载

标签 c++ overloading

问题

我发现 std::basic_stringc_str 成员函数很难看,但同时我不希望创建大量临时 来影响性能>std::basic_string

示例

例如,给定这些函数签名:

void foo(const char* s);

void bar(const std::string& s);

显式调用 c_str

如果我有一个 std::string,我必须在调用站点显式调用 c_str 成员函数才能调用 foo,这有点丑。

std::string s = "...";
foo(s.c_str()); // Yuck! Ugly!

创建临时对象

但是如果我已经有一个 const char* 编译器需要创建一个临时 std::string 才能调用 bar,这可能会影响性能。

const char* s = "...";
bar(s); // Yuck! Potentially a performance hit!

重载

另一方面,我可以为两者提供重载,然后将结果从一个转发到另一个,但由于懒惰,我不想编写超出需要的代码。

void baz(const char* s);

// Yuck! Carpal tunnel syndrome imminent.
inline void baz(const std::string& s)
{
   baz(s.c_str());
}

要求

所以我认为有一个更好的选择:

  1. 不需要编写重载。
  2. 函数签名不是很丑吗?
  3. 不会影响性能。
  4. 不会涉及在函数内编写(太多)额外代码。

可能的替代方案

我认为boost::string_ref ,会在这里帮助我,但它缺乏一种廉价的方法来转换为 const char*

解决方案

所以我的想法是创建一个新类来帮助我实现这一目标,如下所示:

class c_str
{
public:
   c_str(const char* s)
      : s(s)
   {
   }

   c_str(const std::string& s)
      : s(s.c_str())
   {
   }

   operator const char*() const
   {
      return s;
   }

private:
   const char* s;
};

void qux(const c_str& s)
{
   std::string s1 = s;
   const char* s2 = s;
   std::cout << s;
}

使用

foo("s1");

const char* s2 = "s2";
foo(s2);

const std::string s3 = "s3";
foo(s3);

foo(std::string("s4"));

是否已经存在类似的类?或者有更好的选择吗?

编辑:如果有许多类似字符串的参数,问题会很快升级。在我的示例中只有一个,但也可以有很多。

最佳答案

不要低估现代编译器的力量。 在考虑优化这样的代码之前,一定要先进行分析。

IMO,在编写优化代码之前,最好先编写干净、可维护和安全的代码,尝试比库更“智能”。

如果您必须优化字符串(char* 或 std::string)操作,因为您的应用程序的目标是处理字符串(大型字符串数据集),也许您需要找到其他类型用于您特定用途的容器(和/或字符串池,...)。

关于c++ - 减少 "const char*"和 "const std::string&"参数的重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23386685/

相关文章:

c++ - 在 C++ 类中保存函数

c++ - 将一个 long double 存储在多个 double 变量中

c++ - 在两个 vector 中对 vector 进行空间高效解包的优雅方法

c++ - 创建引用 vector 的优雅方式

php - 在另一个函数中使用 php 的魔术函数不起作用

c++ - operator>>(,) 重载以一种令人惊讶的方式表现

c++ - 如何在泛型类中用友元函数重载运算符?

c++ - 从多个线程调用 c++ dll 中的函数的效果

c++ - 区分用户和非用户类型和模板特化

c++ - 跨两个 DLL 的 `using` 语句