どちらも部分的な特殊化を必要とします。最初はSFINAEが必要です。関数テンプレートは完全に特殊化できるだけなので、何らかのヘルパーオブジェクトを使用する必要があります。
template <typename T, int P>
T item(size_t s);
template < typename T, typename Enable = void >
struct item_
{
template < int P >
T apply(size_t s);
};
template < typename T >
struct item_<T, typename enable_if< is_numeric<T> >::type >
{
template < int P >
static T apply(size_t s) { return static_cast<T>(rand()); }
};
template < >
struct item_<std::string, void>
{
template < int P >
static std::string apply(size_t s) { return "NSTHEOSUNTH"; }
};
template < typename T, int P >
T item(size_t s) { return item_<T>::template apply<P>(s); }
また、タグディスパッチ検討するかもしれない:
struct numeric_tag {};
struct string_tag {};
struct wtf_tag {};
template < typename T, int P >
T item(size_t s, numeric_tag) { return static_cast<T>(rand()); }
template < typename T, int P >
T item(size_t s, string_tag) { return "SNTHEO"; }
template < typename T, int P >
T item(size_t s)
{
item(s, if_
<
is_numeric<T>
, numeric_tag
, typename if_
<
is_same< std::string, T >
, string_tag
, wtf_tag
>::type
>::type());
}
それとも、タグと一致し、ペアのベクトルを使用して...各最初のテストにそれらを反復処理するためにいくつかのメタ関数クラスをミックス可能性があり(メタファンクションクラス)、2番目のタグ(タグ)を返して実装を選択します。
これについてはたくさんの方法があります。
申し訳ありませんが、私のコンパイラがすべての時間を主張して以来、私はis_numericを取得できますか... –
bua