【发布时间】:2015-11-10 23:16:55
【问题描述】:
我有一个枚举,我们称之为类型。它的值如下:
enum Type { STRING, TYPE_A_INT, TYPE_B_INT};
我想编写一个函数 Foo,它可以采用任意多个 {int, string} 类型的值,但强制模板参数与参数类型匹配。
理想情况下,它的行为如下:
Foo<STRING, TYPE_A_INT>("str", 32); // works
Foo<STRING, TYPE_B_INT>("str", 32); // works
Foo<STRING, TYPE_B_INT, TYPE_A_INT, STRING>("str", 32, 28, "str"); // works
Foo<STRING, TYPE_B_INT>("str", "str"); // doesn't compile
有没有办法做到这一点?
似乎我可以执行以下操作,但这不起作用,因为 Args 将是 Type 而 args 将是 {string, int}。
template<typename Arg, typename... Args>
std::enable_if<(std::is_same<Arg, STRING>::value)>
Foo(String arg, Args... args) {
// Do stuff to arg, then make recursive call.
Foo(args);
}
template<typename Arg, typename... Args>
std::enable_if<(std::is_same<Arg, TYPE_A_INT>::value)>
Foo(int arg, Args... args) {
// Do stuff to arg, then make recursive call.
Foo(args);
}
我可以将参数包装成类似
pair<Type, string>
pair<Type, int>
但最好避免这种情况。
【问题讨论】:
-
在
Do stuff to arg部分中,如果该类型无论如何都不起作用,它不会有编译器错误吗?当编译器应该为您执行此操作时,您为什么需要限制它? -
为什么不在使用
std::is_same的模板函数中实现static_assert来要求允许的类型之一?
标签: c++ variadic-templates variadic-functions enable-if