Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 C++;11比较参数包_C++11_Variadic Templates - Fatal编程技术网

C++11 C++;11比较参数包

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

我正试图了解参数包,需要一些帮助

看看下面的人为示例,是否有一种方法可以将Args与T进行比较,并且只允许
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;
}