问题
我发现 std::basic_string
的 c_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());
}
要求
所以我认为有一个更好的选择:
- 不需要编写重载。
- 函数签名不是很丑吗?
- 不会影响性能。
- 不会涉及在函数内编写(太多)额外代码。
可能的替代方案
我认为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/