gpt4 book ai didi

c++ - 在不传递参数的情况下重载 C++ 函数

转载 作者:太空狗 更新时间:2023-10-29 20:42:47 24 4
gpt4 key购买 nike

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

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

最佳答案

这被称为 “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对于在全局范围内声明的变量名。

关于c++ - 在不传递参数的情况下重载 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17654705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com