4

特定のタイプのみを許可する必要がある関数テンプレートがあります。私は他の質問を見てきましたが、それらはブーストとプリミティブのタイプを使用していました。この場合、ブーストはなく、ユーザー定義のクラスです。

元:

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 に答える