2017-07-21 7 views
7

基本タイプのみのテンプレート特殊化を行う方法はありますか? 私は、次の操作を行うことを試みた:基本タイプのテンプレート特殊化

template<typename T, typename = typename std::enable_if<!std::is_fundamental<T>::value>::type> 
class foo 
{ 
} 

template<typename T, typename = typename std::enable_if<std::is_fundamental<T>::value>::type> 
class foo 
{ 
} 

しかし、私はテンプレートがすでに定義されていること、エラーを取得しています。

+0

の可能性のある重複した[SFINAEテンプレートパラメータとして戻り値の型での作業ではなく](https://stackoverflow.com/questions/15427667/ sfinae-working-in-return-type-but-not-template-parameter) –

+0

@EdgarRokyan dupではありません。その1つは機能を扱っています、このクラスは – Justin

+0

@ジャスティンですが、原則は同じでなければいけませんか? –

答えて

15

ここでは、特殊化ではなく、同じ名前の2つのテンプレート化されたクラスを作成しています。あなたは一般的なものを作成し、それを専門にする必要があります

// not specialized template (for non-fundamental types), Enabler will 
// be used to specialize for fundamental types 
template <class T, class Enabler = void> 
class foo { }; 

// specialization for fundamental types 
template <class T> 
class foo<T, std::enable_if_t<std::is_fundamental<T>::value>> { }; 
+0

ありがとうございます:) –

+4

本当に '!is_fundamental'を専門にする必要はありますか?プライマリテンプレートを使用することができます。 – Rakete1111

+0

shared_ptrsにプライマリテンプレートを使用しています。ロックフリーの値を格納するパターンを作成しています。 –

関連する問題