繁体   English   中英

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

[英]SFINAE with variadic template classes?

我似乎找不到使用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...> {}

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

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

我们调整参考检查:

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

template <typename... Args>
struct RefCheck<Pack<Args...>>: RefCheck<Args...> {};

现在我们可以使用Pack

template <typename P, bool = RefCheck<P>::value> class NoRef;

template <typename... Args>
class NoRef<Pack<Args...>, false> {
    // no reference in Args... here
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM