質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
メタプログラミング

メタプログラミングとは、プログラミング技法の一つ。プログラムをプログラミングすることを指します。他のプログラムや、そのプログラム自体を操作・出力するメタプログラムを記述する作業をメタプログラミングと呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

949閲覧

型から関数を選択する方法

jbe00214

総合スコア63

メタプログラミング

メタプログラミングとは、プログラミング技法の一つ。プログラムをプログラミングすることを指します。他のプログラムや、そのプログラム自体を操作・出力するメタプログラムを記述する作業をメタプログラミングと呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/10/24 13:01

前提

例えば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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

conditional_tは二者選択であり,3つ以上では処理できません。次のコード例で言うと,long型の場合にも関数オブジェクトを選択したいのですがその方法がわかりません。

入れ子にすれば良いのでは?

C++

1using max_t = 2 conditional_t<(is_same<T, double>()), max_d, 3 conditional_t<(is_same<T, float>()), max_f, 4 max_l>>;

投稿2020/10/24 13:26

編集2020/10/24 13:26
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbe00214

2020/10/24 13:56

ありがとうございます。入れ子ですね。ちょっと考えていませんでした。できるんですね。解決です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問