C++中具有相同参数类型的函数重载
Function overload with same parameter type in 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)"已具有主体
您可以将模板用作:
//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) {...};
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 使用SFINAE来检测void返回类型函数的存在
- 使用此类型函数有什么优势
- 为什么此函数通过类型函数指针调用后,呼叫明智地行为
- 如何使用无类型函数指针调用C++成员函数
- 模板返回类型函数如何在C++中工作
- 具有通用类型函数的动态库[C ]
- 如何在返回类型函数模板的专用化中使用派生类型?( "couldn't infer template argument" )
- Bon appetit :从 int 返回类型函数在 main() 中打印字符串
- 对于需要其他模板参数的类型函数的部分模板专业化
- c++错误的参数类型-函数指针
- 延迟评估模板类型函数
- 在引用或指针返回类型函数上输入
- 具有指针数据类型的非类型函数模板参数
- STL中使用的C++自定义比较类型(函数谓词与较少结构)
- C++模板基类的非类型函数模板的 using 声明
- 字符串到类型函数,模板专用化使调用统一
- 自由类型函数可以接受 Unicode 文件名吗?