1

パラメータの型は同じだが、論理的な意味が異なる関数をオーバーライドしたい。私は次のようなことを試しました:

class T
{
};

typedef T Age;
typedef T Height;
typedef T Weight;

void foo(Age a){}
void foo(Height a){}
void foo(Weight a){}

しかし、ビルド エラーがあります: エラー C2084: 関数 'void foo(Age)' には既に本体があります

1つの解決策は次のとおりです。

class Age : public T{};
class Height : public T{};
class Weight : public T{};

しかし、この目的のためだけに名前空間を新しいクラスで埋めたくありません。

派生クラスを使用せずにこれを達成するにはどうすればよいですか?

編集: 私のコードは cpp ファイルにあり、ヘッダーは使用しません。これは簡単な例です。完全な cpp コンテンツは次のとおりです。

class T
{
};

typedef T Age;
typedef T Height;
typedef T Weight;

void foo(Age a){}
void foo(Height a){}
void foo(Weight a){}

int main()
{
    return 0;
}

エラー メッセージ: .cpp(10): エラー C2084: 関数 'void foo(Age)' には既に本体があります

4

5 に答える 5

6

テンプレートは次のように使用できます。

//1. First define T as class template
template<typename U>
class T
{
 public:
    typedef U tag_type;  //you may need this to inspect the type
    //...
};

//2. then define some tags
struct tag_age{};
struct tag_height{};
struct tag_weight{};

//3. then define typedefs
typedef T<tag_age> Age;
typedef T<tag_height> Height;
typedef T<tag_weight> Weight;

//4. then function overloads
void foo(Age a){}
void foo(Height a){}
void foo(Weight a){}

このように、各 typedef は異なる型であり、クラス template の定義でこの機能を明示的に許可しない限り、他の型に暗黙的に変換することはできませんT

于 2012-05-31T09:07:11.217 に答える
2

これは typedef の適切な使用法ではないと思います - 少なくともあなたの例に関しては、おそらくこれは製品コードでは異なるでしょう。ただし、これは IMHO に使用すべき typedef ではありません。変数と関数は異なる論理処理を行うため、適切な名前を付ける必要があります。

void doAge(T age);
void doHeight(T height);

更新: typedefs はどこで適切ですか?

あなたの場合、解決策はコードを複雑にするため、かなり不適切なようです。Typedef は物事を単純化するために使用する必要があります。例については、次の質問に対する私の回答を参照してください:複雑な C 構文の意味

于 2012-05-31T09:08:04.310 に答える
1

あなたは根本的に間違った方向に進んでいます。実パラメータの型ではなく名前を変更してください。あなたがしていることは意味がありません。typedef は基本的に、2 次簡略化された名前を手元のコードに関連付けるために使用しますが、これは単なるプログラマーの略記であり、コンパイラーは常に T を認識します。

数字は、年齢、ボールの数、長さ、高さを表す場合があります...すべての場合において、それらの論理的な使用法は異なりますが、それらの情報をエンコードするために使用される基本的なデータ型は同じままです。このようにアプローチしてはいけません。

于 2012-05-31T09:15:20.983 に答える
0

タグを使用してこれを行うことができます

class T{};

typedef T Age;
typedef T Height;
typedef T Weight;

struct age_tag {};
struct height_tag {};
struct weight_tag {};

void foo(Age a, age_tag ){...}
void foo(Height h, height_tag ){...}
void foo(Weight a, weight_tag ){...}

template<typename TAG> void bar(T t);
template<> void bar<age_tag>(Age a) {...};
template<> void bar<height_tag>(Height h) {...};
template<> void bar<weight_tag>(Weight a) {...};
于 2012-05-31T09:29:34.910 に答える
0

Boost.Serialization で利用可能な BOOST_STRONG_TYPEDEF を試してみてください。

于 2012-05-31T09:00:48.387 に答える