在C ++中是否可以使用某种标识符类似于函数参数来重载函数?这样可以更轻松地使用模板。它还可以使代码看起来更适合我的特定情况,我没有详细解释。
如果没有多大意义,我老实说甚至不知道正确的关键字(请告诉我),这是一个玩具示例:
我想写这样的东西
function(i);
function(special_action);
function(special_action_2);
像这样被理解
function(i);
function_special_action();
function_special_action_2();
实现这一目标的最佳方法是什么?到目前为止,我已经尝试过像这样的虚拟枚举:
// normal action
void function(int i) { ... }
// special actions
enum dummy_enum_for_special_action { special_action };
void function(const dummy_enum_for_special_action & dummy) { ... }
我猜测参数传递将被编译器优化掉。但是,有没有更好的方法呢?
答案 0 :(得分:3)
这被称为“tag dispatch”,这是一种非常常见的技术,它提供了通用函数的库(例如标准<algorithms>
库)。
只需为参数使用单独的标记类型:
struct i { }; // bad name.
struct special_action { };
struct special_action_2 { };
功能声明:
void function(i) { … }
void function(special_action) { … }
void function(special_action_2) { … }
并且这样打电话:
function(i());
function(special_action());
function(special_action_2());
或者,如果你想摆脱括号,使用全局实例(但我不确定这是个好主意);
namespace { // See comment below
struct i_t { } i;
// etc …
}
void function(i_t) { … }
// etc …
unnamed namespace是必要的,以避免违反全局范围内声明的变量名one definition rule。
答案 1 :(得分:2)
你可以使用一系列虚拟类型来表示“tagging”不同的功能。这是一个例子
#include <iostream>
using namespace std;
template <typename tag>
void func(const tag&);
struct First{};
First first;
template <>
void func(const First&){
cout << "funcFirst" << endl;
}
struct Second{};
Second second;
template <>
void func(const Second&){
cout << "funcSecond" << endl;
}
struct Third{};
Third third;
void func(const Third&){
cout << "funcThird" << endl;
}
int main()
{
func(first);
func(second);
func(third);
}
您可以尝试here。
当然,我建议你使用适当的命名空间,以避免出现这种全局定义的问题,特别是关于“第一”和“第二”的问题(在我的例子中)。
请注意,您甚至不需要将该功能设为模板,这只是一种可能性。您可以依赖简单的重载,如func(const Third&amp;)。