2016-11-14 16 views
0

関数テンプレートの特殊

template <typename T> 
inline T fromBool(bool var) { return var ? T(1) : T(0); } 

template <> 
inline Vec2 fromBool<Vec2>(bool var) { return var ? Vec2(1, 1) : Vec2(0, 0); } 

// Some more specializations for Vec3, etc 

これは、複合型Vec2の定義例である:しかし

struct Vec2 { 
    double x, y; 
    Vec2(double a, double b) { x = a; y = b; } 
} 

、専門分野は機能していません。 fromBool<const Vec2>(var)を呼び出すと、コンパイラはデフォルトの実装(単純型の場合)を使用します。

私は間違っていますか?

+2

から一つの可能​​な実装は、私の知る限りのhttpを言うことができるように作品を見つけることができ、C++ 98でそれを実装するのは難しいことではありません。 //ideone.com/LIRxTQ – StoryTeller

+0

@StoryTeller問題を発見したのは、これを 'const'型に定義する必要があったからです。 'const'のすべての特殊化を再定義するための回避策がありますか? – manatttta

+0

質問を編集して実際の問題を表示できますか? – StoryTeller

答えて

4

あなたのコメントから、あなたがVec2const Vec2

template <typename T> 
struct fromBool_impl { 
    static T fromBool(bool var) { return var ? T(1) : T(0); } 
}; 
template <> 
struct fromBool_impl<Vec2> { 
    static Vec2 fromBool(bool var) { 
     return var ? Vec2(1, 1) : Vec2(0, 0); 
    } 
}; 

template <typename T> 
inline T fromBool(bool var) { 
    return fromBool_impl<typename std::remove_cv<T>::type>::fromBool(var); 
} 

int main() { 
    fromBool<Vec2>(true); 
    fromBool<const Vec2>(true); 
} 

ノートの両方で動作するはずバージョンをしたいように、それはそうです:Tが参照型である場合、動作は未定義です。


C++ 11から上記のコードを使用std::remove_cv、それはあなたがstd::remove_cv

関連する問題