我想覆盖具有相同参数类型但具有不同逻辑含义的函数。我尝试过类似的东西:
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)'已经有一个正文
答案 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) {...};