3

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

我猜参数传递将被编译器优化掉。但是,有没有更好的方法来做到这一点?

4

2 回答 2

2

您可以使用一系列虚拟类型来“标记”不同的功能。这是一个例子

#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);
}

你可以在这里试试。

当然,我建议您使用适当的名称空间,以避免此类全局定义出现问题,尤其是涉及“第一”和“第二”的问题(在我的示例中)。

请注意,您甚至不需要将函数设为模板,这只是一种可能性。您可以依赖简单的重载,如 func(const Third&)。

于 2013-07-15T12:55:49.627 回答