Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.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++ 具有可变模板类的SFINAE?_C++_Variadic Templates_Sfinae - Fatal编程技术网

C++ 具有可变模板类的SFINAE?

C++ 具有可变模板类的SFINAE?,c++,variadic-templates,sfinae,C++,Variadic Templates,Sfinae,对于将SFINAE与可变模板类一起使用,我似乎找不到一个好的解决方案 假设我有一个可变模板对象,它不喜欢引用: template<typename... Args> class NoRef { //if any of Args... is a reference, this class will break //for example: std::tuple<std::unique_ptr<Args>...> uptrs; }; te

对于将SFINAE与可变模板类一起使用,我似乎找不到一个好的解决方案

假设我有一个可变模板对象,它不喜欢引用:

template<typename... Args>
class NoRef
{
    //if any of Args... is a reference, this class will break
    //for example:
    std::tuple<std::unique_ptr<Args>...> uptrs;
};
template<typename T, typename... Other>
struct RefCheck
{
    static const bool value = std::is_reference<T>::value || RefCheck<Other...>::value;
};
template<typename T>
struct RefCheck<T>
{
    static const bool value = std::is_reference<T>::value;
};
模板
类NoRef
{
//如果任何参数…是引用,则此类将中断
//例如:
std::元组uptrs;
};
以及一个类,用于方便地检查参数包是否包含引用:

template<typename... Args>
class NoRef
{
    //if any of Args... is a reference, this class will break
    //for example:
    std::tuple<std::unique_ptr<Args>...> uptrs;
};
template<typename T, typename... Other>
struct RefCheck
{
    static const bool value = std::is_reference<T>::value || RefCheck<Other...>::value;
};
template<typename T>
struct RefCheck<T>
{
    static const bool value = std::is_reference<T>::value;
};
模板
结构参照检查
{
静态常量布尔值=std::is|reference::value | | RefCheck::value;
};
模板
结构参照检查
{
静态常量布尔值=std::is_reference::value;
};

在arg包中存在引用的情况下,我如何使用它来专门化NoRef?

我担心这是不可能的,因为模板包非常笨拙。但是,您可以打包

// Used to transport a full pack in a single template argument
template <typename... Args> struct Pack {};

这不使用SFINAE,但本质上符合您的意图:

template<bool Ref, typename... Args>
class NoRef_;

template<typename... Args>
class NoRef_<false, Args...>
{
    std::tuple<std::unique_ptr<Args>...> uptrs;
};
template<typename... Args>
class NoRef_<true, Args...>
{
    // contains reference
};

template<typename... Args>
using NoRef = NoRef_<RefCheck<Args...>::value, Args...>;

// alternative from Nawaz

template<typename... Args> struct NoRef : NoRef_<RefCheck<Args...>::value, Args...> {}
模板
类NoRef_2;;
模板
类NoRef_
{
std::元组uptrs;
};
模板
类NoRef_
{
//包含引用
};
模板
使用NoRef=NoRef_2;;
//纳瓦兹的替代方案
模板结构NoRef:NoRef{}

+1。但是我认为
模板结构NoRef:NoRef{}会更好。现在,
NoRef
是一个没有非类型模板参数(即布尔值)的不同类模板。我喜欢这个解决方案,尽管我还不能在MSVC中别名模板。但纳瓦兹也提供了一个解决方案。