gpt4 book ai didi

c++ - 引用特定函数参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:05:21 27 4
gpt4 key购买 nike

好吧,令人费解的问题。如果我有一个具有多个可选参数的函数或类构造函数(实际上只是一个特殊函数),有没有办法指定一个而不是另一个?例如:

float divide ( float a = 1.0, float b = 1.0 ) { return a/b; }

如何在不指定 a 的情况下指定 b?

附言我知道这个例子有点做作,但它很重要。

最佳答案

C++ 中没有内置选项来命名调用中的特定参数(例如在 Python 中)。

可以使用辅助 struct 伪造此类命名参数。示例:

#include <iostream>

struct Denom {
float x;
Denom(float x): x(x) { }
};

struct Num {
float x;
Num(float x): x(x) { }
};

float divide(float a, float b) { return a / b; }
inline float divide(const Num &num) { return divide(num.x, 1.0f); }
inline float divide(const Denom &denom) { return divide(1.0f, denom.x); }

int main()
{
// regular call:
std::cout << "3 / 2: " << divide(3.0f, 2.0f) << '\n';
// call with numerator only:
std::cout << "3 / default: " << divide(Num(3.0f)) << '\n';
// call with denominator only:
std::cout << "default / 2: " << divide(Denom(2.0f)) << '\n';
// done
return 0;
}

输出:

3 / 2: 1.5
3 / default: 3
default / 2: 0.5

Live Demo on coliru


我记得帮助程序 struct 技巧甚至可以扩展以允许链接以及参数的任意顺序。谷歌搜索“C++ 命名参数”,我在 SO: C++ named arguments implementation with derived classes 的一个答案中找到了另一个例子。 .示例:

#include <iostream>

struct Args {
float x, y;
Args(): x(1.0f), y(1.0f) { }
Args& num(float x) { this->x = x; return *this; }
Args& denom(float y) { this->y = y; return *this; }
};

float divide(float a, float b) { return a / b; }
float divide(const Args &args) { return divide(args.x, args.y); }

int main()
{
// regular call:
std::cout << "3 / 2: " << divide(3.0f, 2.0f) << '\n';
// call with numerator only:
std::cout << "3 / default: " << divide(Args().num(3.0f)) << '\n';
// call with denominator only:
std::cout << "default / 2: " << divide(Args().denom(2.0f)) << '\n';
// args in arbitrary order:
std::cout << "3 / 2: " << divide(Args().denom(2.0f).num(3.0f)) << '\n';
// done
return 0;
}

输出:

3 / 2: 1.5
3 / default: 3
default / 2: 0.5
3 / 2: 1.5

Live Demo on coliru


有一次,我在 gtkmm 中看到了一个我自己不时使用的简单技巧——提供一个额外的 enum 参数来消除歧义。示例:

#include <iostream>

enum ArgInitNum { InitNum };
enum ArgInitDenom { InitDenom };

float divide(float a, float b) { return a / b; }
inline float divide(ArgInitNum, float a) { return divide(a, 1.0f); }
inline float divide(ArgInitDenom, float b) { return divide(1.0f, b); }

int main()
{
// regular call:
std::cout << "3 / 2: " << divide(3.0f, 2.0f) << '\n';
// call with numerator only:
std::cout << "3 / default: " << divide(InitNum, 3.0f) << '\n';
// call with denominator only:
std::cout << "default / 2: " << divide(InitDenom, 2.0f) << '\n';
// done
return 0;
}

输出:

3 / 2: 1.5
3 / default: 3
default / 2: 0.5

Live Demo on coliru


注意:

我不会将此技术用于可以简单地使用不同函数名称的普通函数。但是,这是消除构造函数歧义的一个很好的选择。

关于c++ - 引用特定函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51345393/

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