[解決済み] C++で関数名にエイリアスを割り当てるにはどうすればよいですか?
2022-09-18 19:44:24
質問
型、変数、名前空間に対して新しい名前を作るのは簡単です。しかし、関数に新しい名前を割り当てるにはどうしたらよいのでしょうか。たとえば、私は名前
holler
に対して
printf
. #defineは当然として...他に方法はないでしょうか?
解決策です。
-
#define holler printf
-
void (*p)() = fn; //function pointer
-
void (&r)() = fn; //function reference
-
inline void g(){ f(); }
どのように解決するのですか?
さまざまなアプローチがあります。
-
C++11 でテンプレート以外のオーバーロードされない関数を使用する場合、単純に使用することができます。
const auto& new_fn_name = old_fn_name;
-
この関数に複数のオーバーロードがある場合は
static_cast
:const auto& new_fn_name = static_cast<OVERLOADED_FN_TYPE>(old_fn_name);
例: 関数のオーバーロードが2つある場合
std::stoi
int stoi (const string&, size_t*, int); int stoi (const wstring&, size_t*, int);
最初のバージョンのエイリアスを作りたい場合は、次のようにします。
const auto& new_fn_name = static_cast<int(*)(const string&, size_t*, int)>(std::stoi);
注意 オーバーロードされた関数のエイリアスを作成し、そのすべてのオーバーロードされたバージョンを動作させる方法はありません。
-
C++14 では、さらに踏み込んで
constexpr
テンプレート変数を使うことができます。これにより、テンプレート化された関数のエイリアスを作成することができます。template<typename T> constexpr void old_function(/* args */); template<typename T> constexpr auto alias_to_old = old_function<T>;
-
さらに、C++11 からは、以下のような関数が用意されています。
std::mem_fn
という関数があり、メンバ関数のエイリアスを作成することができます。次の例をご覧ください。struct A { void f(int i) { std::cout << "Argument: " << i << '\n'; } }; A a; auto greet = std::mem_fn(&A::f); // alias to member function // prints "Argument: 5" greet(a, 5); // you should provide an object each time you use this alias // if you want to bind an object permanently use `std::bind` greet_a = std::bind(greet, a, std::placeholders::_1); greet_a(3); // equivalent to greet(a, 3) => a.f(3);
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] パラメータを取るBashのエイリアスを作る?
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み] リファレンスとポインタの使い分け
-
[解決済み] コンストラクタのコロンメンバー(" : ")の変な構文は何ですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド