避免在 ctor 初始化列表中的字符串赋值中重复调用函数
Avoid double-calling function in string assignment in ctor initializer list
在下面的代码示例中,我想在 A
的初始化列表中用函数中的 return 值初始化 std::string A::str_
(可能 return NULL
),或者 const char*
。但我不喜欢 Func()
被调用两次的事实。
#include <iostream>
const char* Func()
{
char* p = NULL;
// Assign p: may be NULL or non-NULL
return p;
}
class A
{
public:
A() : str_( Func() ? Func() : "NULL" ) {}
std::string str_;
};
int main( int argc, char* argv[] )
{
A a;
std::cout << a.str_ << std::endl;
return 0;
}
我想做这样的事情:
A() : str_( ( const char*& tmp = Func() ) ? tmp : "NULL" ) {}
但是以这种方式使用临时变量——甚至引用来延长它们的生命周期——似乎是非法的(根据我目前的理解)。
是否有 C++03 语法允许在初始化列表中初始化 A::str_
,只调用一次 Func()
,并且不使用 global/static 变量?如果有使用临时变量的解决方案,我想学习一下它的语法。
在 C++11 中,使用委托构造函数
class A
{
private:
A(const char* s) str_(s ? s : "NULL") {}
public:
A() : A(Func()) {}
std::string str_;
};
在c++03中,创建函数助手
class A
{
private:
static const char* FuncNotNull() { const char* s = Func(); return s ? s : "NULL"); }
public:
A() : str_(FuncNotNull()) {}
std::string str_;
};
这里是一个 lambda 表达式的解决方案 "abused":
A() : str_( ([]()->const char*{ const char* p=Func(); return (p ? p : "NULL"); })() ) {}
我实际上对 Jarod 的回答投了赞成票。
但我发现 lambda 的东西很丑,我也想展示它:-)
在下面的代码示例中,我想在 A
的初始化列表中用函数中的 return 值初始化 std::string A::str_
(可能 return NULL
),或者 const char*
。但我不喜欢 Func()
被调用两次的事实。
#include <iostream>
const char* Func()
{
char* p = NULL;
// Assign p: may be NULL or non-NULL
return p;
}
class A
{
public:
A() : str_( Func() ? Func() : "NULL" ) {}
std::string str_;
};
int main( int argc, char* argv[] )
{
A a;
std::cout << a.str_ << std::endl;
return 0;
}
我想做这样的事情:
A() : str_( ( const char*& tmp = Func() ) ? tmp : "NULL" ) {}
但是以这种方式使用临时变量——甚至引用来延长它们的生命周期——似乎是非法的(根据我目前的理解)。
是否有 C++03 语法允许在初始化列表中初始化 A::str_
,只调用一次 Func()
,并且不使用 global/static 变量?如果有使用临时变量的解决方案,我想学习一下它的语法。
在 C++11 中,使用委托构造函数
class A
{
private:
A(const char* s) str_(s ? s : "NULL") {}
public:
A() : A(Func()) {}
std::string str_;
};
在c++03中,创建函数助手
class A
{
private:
static const char* FuncNotNull() { const char* s = Func(); return s ? s : "NULL"); }
public:
A() : str_(FuncNotNull()) {}
std::string str_;
};
这里是一个 lambda 表达式的解决方案 "abused":
A() : str_( ([]()->const char*{ const char* p=Func(); return (p ? p : "NULL"); })() ) {}
我实际上对 Jarod 的回答投了赞成票。 但我发现 lambda 的东西很丑,我也想展示它:-)