3

C++で、関数の引数に似たある種の識別子を使用して関数をオーバーロードすることは可能ですか? これにより、テンプレートを簡単に使用できるようになります。また、詳細には説明していませんが、私の特定のケースではコードの見栄えが良くなります。

それがあまり意味をなさない場合、そして正直なところ、これに適したキーワードさえ知りません(教えてください)、おもちゃの例を次に示します。

こういうの書きたい

function(i);
function(special_action);
function(special_action_2);

このように理解されて

function(i);
function_special_action();
function_special_action_2();

これを達成する最善の方法は何ですか?これまでのところ、次のようなダミーの列挙型を試してみました:

// normal action
void function(int i) { ... }

// special actions
enum dummy_enum_for_special_action { special_action };
void function(const dummy_enum_for_special_action & dummy) { ... }

パラメータの受け渡しはコンパイラによって最適化されると思います。しかし、これを行うためのより良い方法はありますか?

4

2 に答える 2

2

さまざまな機能の「タグ付け」に一連のダミー型を使用できます。これが例です

#include <iostream>

using namespace std;

template <typename tag>
void func(const tag&);

struct First{};
First first;

template <>
void func(const First&){
    cout << "funcFirst" << endl;
}

struct Second{};
Second second;

template <>
void func(const Second&){
    cout << "funcSecond" << endl;
}

struct Third{};
Third third;

void func(const Third&){
    cout << "funcThird" << endl;
}

int main()
{
    func(first);
    func(second);
    func(third);
}

ここで試すことができます。

もちろん、このようなグローバル定義の問題を回避するために、適切な名前空間を使用することをお勧めします。特に、「最初」と「2番目」に関係するものに注意してください (私の例では)。

関数をテンプレートにする必要さえないことに注意してください。これは 1 つの可能性にすぎません。func(const Third&) のように、単純なオーバーロードに依存できます。

于 2013-07-15T12:55:49.627 に答える