[解決済み】テンプレートの引数として渡される関数
質問
C++のテンプレート関数を引数として渡す際のルールを探しています。
これは、ここに例があるように、C++でサポートされています。
#include <iostream>
void add1(int &v)
{
v+=1;
}
void add2(int &v)
{
v+=2;
}
template <void (*T)(int &)>
void doOperation()
{
int temp=0;
T(temp);
std::cout << "Result is " << temp << std::endl;
}
int main()
{
doOperation<add1>();
doOperation<add2>();
}
しかし、この技法を学ぶのは難しい。 ググってみると、"function as a template argument"と出てきます。 はあまり出てきません。また、古典的な C++テンプレート完全ガイド も意外と議論されていない(少なくとも私が検索した限りでは)。
私が抱いている疑問は、これが有効なC++なのか(それとも広くサポートされている拡張なのか)です。
また、このようなテンプレート呼び出しの際に、同じシグネチャを持つファンクタを明示的な関数と入れ替えて使用できるようにする方法はあるのでしょうか?
以下はその例です。 ではない は上記のプログラムでは、少なくとも ビジュアル C++ というのも、明らかに構文がおかしいからです。カスタムの比較演算を定義したい場合に std::sort アルゴリズムに関数ポインタやファンクタを渡すのと同じように、関数をファンクタに、またはその逆に切り替えられるといいんですけどね。
struct add3 {
void operator() (int &v) {v+=3;}
};
...
doOperation<add3>();
ウェブリンクやC++テンプレートブックのページへのポインタをお願いします。
どのように解決するのですか?
はい、有効です。
ファンクターでも使えるようにすることについては、通常、代わりに次のような解決策があります。
template <typename F>
void doOperation(F f)
{
int temp=0;
f(temp);
std::cout << "Result is " << temp << std::endl;
}
のどちらかを呼び出すことができるようになりました。
doOperation(add2);
doOperation(add3());
この場合の問題は、コンパイラがインラインで
add2
というのは、コンパイラが知っているのは、関数ポインタ型の
void (*)(int &)
に渡されます。
doOperation
. (ただし
add3
はファンクタであるため,簡単にインライン化することができます.ここで,コンパイラは,型
add3
は関数に渡されます。つまり、呼び出すべき関数は
add3::operator()
であり、未知の関数ポインタではありません)。
関連
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み] template "と "typename "キーワードはどこに、なぜ入れなければならないのですか?
-
[解決済み] C++テンプレート関数定義の.CPPファイルへの格納
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる