【发布时间】:2012-04-16 11:34:41
【问题描述】:
在开发应用程序时,我遇到了以下问题。当给定的函数指针为空时,我想返回一个空的std::list<string>,否则返回该函数的结果。这是我的代码的简化版本:
typedef std::list<std::string> (*ParamGenerator)();
std::list<std::string> foo() {
/* ... */
ParamGenerator generator = ...;
if(generator)
return generator();
else
return {};
}
但是,在这些情况下,我通常喜欢使用三元 (?:) 运算符,所以我尝试以这种方式使用它(像往常一样):
return generator ? generator() : {};
但是得到了这个错误:
somefile.cpp:143:46: error: expected primary-expression before ‘{’ token
somefile.cpp:143:46: error: expected ‘;’ before ‘{’ token
这是否意味着我不能使用三元运算符从initializer_list 返回使用其构造函数创建的对象?有什么特别的原因吗?
【问题讨论】:
-
我的建议是:根本不要这样做。让它成为一个通用算法,它接受一个迭代器(其类型是一个模板参数),所以当你意识到
std::list是一个糟糕的选择时,你可以相对轻松地改用其他东西。 -
@JerryCoffin 我可能会接受这个建议;)。我想知道它是否有可能(或者为什么它不能做到)。
-
好的,很公平。这是一个有趣的问题(我对此投了赞成票),尽管我认为确切的应用程序可能不是最好的。
-
其实,现在想想,我不能模板化这个函数。该函数实际上是从共享对象导出的,所以我需要在编译期间知道返回类型。我同意在不同的情况下,模板化的解决方案会更好。
标签: c++ constructor c++11 ternary-operator initializer-list