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

Function overload with same parameter type in C++

本文关键字:类型 函数 重载 参数 C++      更新时间:2023-10-16

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

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)"已具有主体

您可以将模板用作:

//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

我认为这不是 typedefs 的适当用法 - 至少在你的例子中,也许这在生产代码中是不同的。但是,这不是恕我直言应该使用的typedefs。你应该正确命名你的变量和函数,因为它们会做不同的逻辑工作:

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

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

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

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

一个数字可以代表年龄,一个球的数量,长度,高度...在所有情况下,它们的逻辑用途都不同,但用于对其信息进行编码的基本数据类型保持不变。你不应该这样处理它。

尝试BOOST_STRONG_TYPEDEF 这是 Boost.Serialization 中的 avalailabel。

您可以使用标签来执行此操作

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) {...};