1. ホーム
  2. c++

[解決済み] C++で関数名にエイリアスを割り当てるにはどうすればよいですか?

2022-09-18 19:44:24

質問

型、変数、名前空間に対して新しい名前を作るのは簡単です。しかし、関数に新しい名前を割り当てるにはどうしたらよいのでしょうか。たとえば、私は名前 holler に対して printf . #defineは当然として...他に方法はないでしょうか?

解決策です。

  1. #define holler printf
  2. void (*p)() = fn; //function pointer
  3. void (&r)() = fn; //function reference
  4. 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);