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)' 已经有一个主体

一种解决方案是:

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): error C2084: function 'void foo(Age)' has a body

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 都是不同的类型,并且不能隐式转换为其他类型,除非您在类模板的定义中明确允许此功能T

于 2012-05-31T09:07:11.217 回答
2

我认为这不是 typedefs 的适当用法-至少就您的示例而言,这在生产代码中可能有所不同。但是,恕我直言,这不是 typedef 应该使用的。您应该正确命名变量和函数,因为它们会执行不同的逻辑操作:

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

更新: 那么 typedefs 在哪里合适呢?

在您的情况下,该解决方案会使代码复杂化,因此它似乎相当不合适。应该使用 Typedef 来简化事情。例如,请参阅我对以下问题的回答:复杂 C 语法的含义

于 2012-05-31T09:08:04.310 回答
1

你基本上是在错误的轨道上。更改实际参数的名称而不是其类型。你在做什么没有意义。typedef 基本上使用二级简化名称来更多地与手头的代码相关,但它只是程序员的简写,编译器在所有情况下仍然会看到 T。

一个数字可能代表年龄、球数、长度、身高……在所有情况下,它们的逻辑用途是不同的,但用于对其信息进行编码的基本数据类型保持不变。你不应该以这种方式接近它。

于 2012-05-31T09:15:20.983 回答
0

试试 BOOST_STRONG_TYPEDEF,它是 Boost.Serialization 中的 avalailabel。

于 2012-05-31T09:00:48.387 回答
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 回答