前提
例えばcblasのようなライブラリには,同じ機能の関数として,floatやdoubleごとにそれぞれ専用の名前が付いている関数があります。cblas_gcopyやcblas_scopyのような関数です。このような関数が含まれる関数をその型ごとに作成する場合,doubleやfloatといった引数の型ごとに関数を多重定義する方法はあります。テンプレートの特殊化でも作成できるでしょう。しかし,これらの方法で作成した関数内部は,cblas_gcopyなどの関数以外はほとんど同様のコードで重複するので,コードは無駄に膨らみます。doubleやfloatごとに関数だけを交換できれば,スッキリと解決することができると思います。
解決方法で考えられることと実現したいこと
次のように,関数オブジェクトとconditional_tを使ったメタプログラミングの方法で,doubleとfloatごとに関数を選択することができます。この例では,2値を比較して大きい方を返すmax関数群を例にしています。 そこで,実現したいことは,intやlongのような型でも対応できるようにしたいのですが,conditional_tは二者選択であり,3つ以上では処理できません。次のコード例で言うと,long型の場合にも関数オブジェクトを選択したいのですがその方法がわかりません。 どのような方法が考えられるでしょうか。
該当のソースコード
C++
1using namespace std; 2template<typename T> 3struct Foo{ 4 struct max_f{ 5 float operator()(float a,float b){ 6 return std::fmaxf(a,b); 7 } 8 }; 9 struct max_d{ 10 double operator()(double a,double b ){ 11 return std::fmaxl(a,b); 12 } 13 }; 14 ///long型の場合に,この関数オブジェクトを選択できるようにしたい 15 struct max_l{ 16 long operator()(long a,long b){ 17 return std::max(a,b); 18 } 19 }; 20 21 T func(T a,T b){ 22 using max_t = conditional_t<(is_same<T,double>()),max_d,max_f>; 23 //様々な処理 24 max_t f; 25 return f(a,b); 26 } 27}; 28int main(){ 29 Foo<float> f; 30 float tmp= f.func(1,2); 31}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/24 13:56