5

次のテンプレートがあります。

template<class T>
void fn(T t){ }

に変換できるものについては、その動作をオーバーライドしたいと思いますstd::string

明示的なテンプレートの特殊化とパラメーターを使用した非テンプレート関数のオーバーロードの指定はどちらも、引数の変換を試みる前にそれらをテンプレートに一致させているように見えるため、他の関数ではなくstd::stringを渡す呼び出しに対してのみ機能します。std::string

私が望む動作を達成する方法はありますか?

4

1 に答える 1

9

このケースのようなものがC++ 11で役立ちます

#include <type_traits>
#include <string>
#include <iostream>

template<class T>
typename std::enable_if<!std::is_convertible<T, std::string>::value, void>::type
fn(T t)
{
   std::cout << "base" << std::endl;
}

template<class T>
typename std::enable_if<std::is_convertible<T, std::string>::value, void>::type
fn(T t) 
{
   std::cout << "string" << std::endl;
}

int main()
{
   fn("hello");
   fn(std::string("new"));
   fn(1);
}

実際の例

そしてもちろん、C++11 を持っていない場合、またはブーストを使用している場合は、手動で実現できます。

于 2013-07-18T07:25:08.433 に答える