我正在尝试创建一个类模板,它提供了一种检查模板是否被赋予特定类型的方法。
#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;'不是模板非类型参数的有效类型
但我看不出原因。