C++11 C++;11比较参数包
我正试图了解参数包,需要一些帮助 看看下面的人为示例,是否有一种方法可以将Args与T进行比较,并且只允许C++11 C++;11比较参数包,c++11,variadic-templates,C++11,Variadic Templates,我正试图了解参数包,需要一些帮助 看看下面的人为示例,是否有一种方法可以将Args与T进行比较,并且只允许bar()在匹配时进行编译?例如,如果我创建Task我希望bar(float,char,float)不编译,而是bar(int,char,float)编译得很好。这是否可行 template <typename... Types> struct foo {}; template<typename T> struct Task; template<typena
bar()
在匹配时进行编译?例如,如果我创建Task
我希望bar(float,char,float)
不编译,而是bar(int,char,float)
编译得很好。这是否可行
template <typename... Types>
struct foo {};
template<typename T>
struct Task;
template<typename R, typename...Args>
struct Task<R(Args...)>
{
template<typename... T>
std::enable_if<is_same<T, Args>
void bar(T... args)
{
//do something here
}
};
int main()
{
Task<int(int)> task;
int a = 0;
float b = 1.0;
bool c = false;
//compiles
task.bar(a);
//none of these should compile
task.bar(b);
task.bar(c);
task.bar(a, b);
task.bar(a, b, c);
}
模板
结构foo{};
模板
结构任务;
模板
结构任务
{
模板
std::enable_如果首先,语法应为:
template<typename R, typename...Args>
struct Task<R(Args...)>
{
template<typename... T>
std::enable_if<is_same<tuple<T...>, tuple<Args...> >::value > bar(T... args)
{
//do something here
}
};
可能在中使用tuple是相同的
?我甚至不知道当t和Args是参数包时,tuple是什么意思。或者可能我只是误解了语法。上面有很多问题。如果不使用包,它将无法编译。请尝试让代码只使用一个参数。然后开始添加…
s。编辑:这是对建议直接使用void bar(Args…Args)
的已删除注释的响应。由于隐式转换(float
,bool
,char
都隐式转换为int
),这不符合OP的预期。您可能会收到警告,但通常不会出现错误(尤其是在VC++之类的东西上)。
#include <type_traits>
#include <tuple>
template<typename T>
struct Task;
template<typename R, typename... Args>
struct Task<R(Args...)>
{
template<typename... OtherArgs>
void bar(OtherArgs... otherArgs)
{
static_assert(
std::is_same<std::tuple<Args...>, std::tuple<OtherArgs...> >::value,
"Use same args types !"
);
// Do something
}
};
int main()
{
Task<int(int)> task;
// Compiles fine
task.bar(1);
// Fails to compile
task.bar('u');
task.bar(0ul);
return 0;
}