使用静态模板constexpr与SFINAE失败

时间:2017-06-03 10:52:03

标签: c++ sfinae

我正在尝试创建一个类模板,它提供了一种检查模板是否被赋予特定类型的方法。

#include <type_traits>

template<typename T, typename U>
class Acceptor
{
public:

    template<typename X>
    static constexpr bool accepts =
        std::is_same<T, typename std::remove_reference<X>::type>::value ||
        std::is_same<U, typename std::remove_reference<X>::type>::value;

    void set(T value) { /* some code */ }
    void set(U value) { /* some code */ }
};

我想在SFINAE表达式中使用上面的模板,如下所示:

#include <type_traits>

class Setter
{
public:
    template<typename T, typename U,
        typename std::enable_if< T::accepts<U> >::type * = nullptr>
    void set(T instance, U&& value)
    {
        instance.set(std::forward<U>(value));
    }

    template<typename T, typename U,
        typename std::enable_if< !T::accepts<U> >::type * = nullptr>
    void set(T instance, U&& value)
    {
        // Nothing to do here
    }
};

但代码不能在GCC 7.1.0或VSV17的MSVC中编译。前者给了我以下错误:

  

错误:'struct std :: enable_if&lt;(T :: accepted&lt;)&gt;'不是模板非类型参数的有效类型

但我看不出原因。

0 个答案:

没有答案