c – 具有可变参数模板类的SFINAE?

前端之家收集整理的这篇文章主要介绍了c – 具有可变参数模板类的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;
};

还有一个类可以方便地检查参数包是否包含引用:

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;
};

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

解决方法

这不使用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...> {}

猜你在找的C&C++相关文章