我正在尝试初始化const&
变量。我试图初始化的变量的值取决于某些条件
例如:
typedef std::vector<string> string_vector;
string_vector data_pool;
const string& data;
if( some_cond )
{
// do something and set data
data = data_pool[some_index1]
}
else
{
// do something and set data
data = data_pool[some_index2]
}
当然上面的代码无效,但这正是我要做的。
我可以使用ternary operator
:
const string& data = (some_cond)? data_pool[some_index1] : data_pool[some_index2];
但是这个语法实际上并没有让我做任何事情来设置值。
所以现在我尝试使用lambda expression
(不太确定我做对了):
const string& data = [&]{
string tmp = "";
{
// do something and set tmp
tmp = data_pool[some_index1]
}
else
{
// do something and set tmp
tmp = data_pool[some_index2]
}
return tmp;
}
但我的问题是这个解决方案需要新的字符串分配,这是我现在买不起的,因为这段代码是我程序的瓶颈。
的问题
data
如何以复杂的方式初始化但有效?
注意
我可以很容易地解决问题。 data
最终将引用data_pool
中的某个项目,因此我需要做的就是计算所需的索引,然后初始化data
。但是我对解决方法不感兴趣,而是对这个基本问题的优雅技术/实践感兴趣。如果初始化比计算向量中的某个索引要复杂一点怎么办?
答案 0 :(得分:2)
你可以使用函数或lambda来做到这一点。可以完成这两个解决方案,以便不执行任何分配,并且const引用实际上对data_pool
中存在的数据进行别名。
有了一个功能,那就是:
const std::string& initConstString(string_vector& pool){
std::size_t index;
//complex initialization stuff
return pool[index];
}
使用lambda:
auto lambda = [&data_pool]() -> const std::string&{
std::size_t index = 0;//For the sake of example
//perform initialization here
return data_pool[index];
};
const std::string& constString = lambda();
Live example for the lambda version on Coliru
我个人更喜欢这个功能,如果初始化代表很多(好吧,> 4-5行),因为我喜欢我的lambdas简洁明了,但这取决于你。