gpt4 book ai didi

c++ - 构造函数中的部分模板推导

转载 作者:行者123 更新时间:2023-12-03 10:05:31 25 4
gpt4 key购买 nike

问题:我经常处于这样一种情况,可以从构造函数的参数中推导出某些类型,但不是全部:

template <typename Res, typename Arg>
struct adder {
adder (Arg a1, Arg a2) : a1 {a1}, a2 {a2} {}
void compute () { res = a1 + a2; }
Res result () { return res; }

Arg a1, a2;
Res res;
};
如果我正在使用 int参数并想指定 unsigned作为结果类型,我想写一些类似的东西:
auto add = adder<unsigned>(42, -51);
......这不起作用。但是,我不想明确提及 int .
候选解决方案:我可以想到两种“让它发挥作用”的方法,首先是与制造商合作:
template <typename Res>
struct wrapper {
template <typename Arg>
static auto make_adder (Arg a1, Arg a2) {
return adder<Res, Arg> (a1, a2);
}
};

auto add = wrapper<unsigned>::make_adder (42, -51);
其次,确保可以在构造函数中推导出所有类型:
template <typename Res, typename Arg>
struct adder_extra {
adder_extra (Arg a1, Arg a2, Res r) : a1 {a1}, a2 {a2} {}
void compute () { res = a1 + a2; }
Res result () { return res; }

Arg a1, a2;
Res res;
};

auto add = adder_extra (42, -51, (unsigned) 0);
问题:有没有首选的方法?这可以用另一种方式更巧妙地解决吗?

最佳答案

你没有提到的一个选项是像标准库那样做,并释放 maker 函数:

template <typename Res, typename Arg>
auto make_adder (Arg a1, Arg a2) {
return adder<Res, Arg> (a1, a2);
}
函数的模板参数推导允许指定模板参数的一部分。 make_adder<unsigned>(42, -51)是完全有效的,最早可以追溯到 C++98。
这也是一种解决方法,没错。但它是一种流行和惯用的方法。

1 - std::make_unique , std::make_shared , std::make_optional , std::make_any , std::make_tuple , 等等。

关于c++ - 构造函数中的部分模板推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66164903/

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