【发布时间】:2018-06-23 10:55:57
【问题描述】:
例如说我有两个简单的功能:
void a(int x)
{
//do something with x
}
void b(int x, float y)
{
// do something with x and y
}
我希望有一个具有可变数量的参数的函数,可以根据标志调用上述两种方法:
template<typename... Args>
void varArgs(bool a_or_b, Args... args)
{
if (a_or_b)
a(args...);
else
b(args...);
}
该标志会告诉我们是要使用第一个函数还是第二个函数,但是由于模板是在编译时实例化的,所以这不起作用。我读过constexpr if,但是我只能使用 c++14,所以我想知道是否有替代方案?
编辑: bool 可以是编译时常量,而不是运行时参数。
【问题讨论】:
-
如果没有大量的类型擦除,您将无法做您想做的事情,因为您在运行时传递了布尔值(并且
constexpr if通常不适用于该布尔值)。如果您将布尔值作为模板参数template <bool B, typename ... Args> void varArgs(Args... args)传递,那么您可以通过标签调度轻松完成。 -
@NirFriedman 刚刚发现 bool 可以是编译时值,您介意发布一个答案,告诉我如何使用它吗?
-
您是否考虑过“int main(int argc, char* argv[])” ... 具有不同数量参数的单个函数。在 C++ 中,按照同样的思路,我创建了“size_t grep (const std::string fileName, const std::string patterns, std::ostream& an_ostream = std::cout)。字符串参数,有人吗?
-
@DOUGLASO.MOEN 这就是我所说的更重的类型擦除。如果你想走那条路,你最好简单地绕过,例如
std::vector<std::any>,或者更好,unordered_map<string, any>,至少这样您就不必将所有参数都转换为字符串并返回。
标签: c++ templates parameter-passing c++14 variadic-templates