4

我有一个必须只允许某些类型的函数模板。我见过其他问题,但他们使用了 boost 和 primitve 类型。在这种情况下,没有提升,它是一个用户定义的类。

前任:

template<typename T>
myfunc(T&)
{ ... }

template<>
myfunc(Foo&)
{
   static_assert(false, "You cannot use myfunc with Foo");
}

static_assert无论我是否myfuncFoo对象调用,问题都会被调用。

myfunc我只是想要某种方式让编译在被调用时停止Foo
我怎样才能实现这个功能?

4

2 回答 2

4

您可以std::is_same为此使用:

#include <type_traits>

template<typename T>
return_type myfunc(T&)
{
   static_assert(std::is_same<T, Foo>::value, "You cannot use myfunc with Foo");

   // ...
}
于 2012-08-03T16:04:42.477 回答
1

使用返回类型R,说:

#include <type_traits>

template <typename T>
typename std::enable_if<!std::is_same<T, Foo>::value, R>::type my_func(T &)
{
    // ...
}

如果你真的不想使用标准库,你可以自己写特征:

template <bool, typename> struct enable_if { };
template <typename T> struct enable_if<true, T> { typedef T type; };

template <typename, typename> struct is_same { static const bool value = false; };
template <typename T> struct is_same<T, T> { static const bool value = true; };
于 2012-08-03T16:05:28.957 回答