重载C ++函数而不传递参数

时间:2013-07-15 12:51:00

标签: c++ function enums arguments identifier

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

我猜测参数传递将被编译器优化掉。但是,有没有更好的方法呢?

2 个答案:

答案 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;)。