C ++中具有相同参数类型的函数重载

时间:2012-05-31 08:59:09

标签: c++

我想覆盖具有相同参数类型但具有不同逻辑含义的函数。我尝试过类似的东西:

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):错误C2084:函数'void foo(Age)'已经有一个正文

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

我认为这不是typedef的合适用法 - 至少可以假设你的例子,也许这在生产代码中是不同的。然而,这不是应该用于恕我直言的typedef。你应该正确命名变量和函数,因为它们会做不同的逻辑:

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

更新:typedef适合哪里?

在您的情况下,解决方案会使代码复杂化,因此看起来相当不合适。应该使用Typedef来简化操作。有关示例,请参阅我对以下问题的回答:Meaning of complex C syntax

答案 2 :(得分:1)

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

数字可能代表年龄,球数,长度,高度......在所有情况下,它们的逻辑用途不同,但用于编码其信息的基本数据类型保持不变。你不应该这样接近它。

答案 3 :(得分:0)

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

答案 4 :(得分: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) {...};