gpt4 book ai didi

c++ - 使用可变参数模板进行统一初始化

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:51 26 4
gpt4 key购买 nike

我有一个 POD ChParam,它是可变参数模板函数 set 中的一个参数。我想在花括号 p.set({ Param::D, 1000.f }, {Param::p, 2000.f }) 中传递给函数参数(构造函数参数)。并认为将隐式调用构造函数并创建 ChParam 对象。但这是不可能的,我应该明确地创建一个对象 a.set(ChParam{ Param::D, 1000.f }, ChParam{ Param::p, 2000.f });

是否有可能以某种方式使用变体 p.set({ Param::D, 1000.f }, { Param::p, 2000.f })

#include <iostream>
using namespace std;

using Float = float;

enum class Param : size_t
{
D = 0,
p
};
struct ChParam
{
Param tag_;
Float value_;
};
class PipeCalcParams
{
private:
Float D_, p_;
public:
PipeCalcParams() : D_(0), p_(0) {}
PipeCalcParams& set_D(Float D) { D_ = D; return *this; }
PipeCalcParams& set_p(Float p) { p_ = p; return *this; }


template <typename... Args>
PipeCalcParams& set(const ChParam& p, Args&&... args) {
set(p);
return set(args...);
}

PipeCalcParams& set(const ChParam& p)
{
switch (p.tag_)
{
case Param::D:
set_D(p.value_);
break;
case Param::p:
set_p(p.value_);
break;
}

return *this;
}

};

int main() {
PipeCalcParams a;
a.set(ChParam{ Param::D, 1000.f }, ChParam{ Param::p, 2000.f });//OK

PipeCalcParams p;
p.set({ Param::D, 1000.f }, { Param::p, 2000.f });//error: no matching function for call to 'PipeCalcParams::set(<brace-enclosed initializer list>, <brace-enclosed initializer list>)' p.set({ Param::D, 1000.f }, { Param::p, 2000.f });
return 0;
}

最佳答案

不能直接使用

{ Param::D, 1000.f }

需要推导时作为函数参数。原因是花括号初始化器列表没有类型。由于它没有类型,因此编译器无法推导出类型。你必须一起帮助它。你可以做你所做的并指定类型,如

ChParam{ Param:D, 1000.f }

或者您可以指定您期望的对象类型。如果你想要相同类型的可变数字,那么 std::intializer_list将工作。它允许编译器从单独的花括号初始化器列表构造元素。使用它你的代码看起来像

PipeCalcParams& set(std::initializer_list<ChParam> args)

当你调用它时你会使用

p.set({{ Param::D, 1000.f }, { Param::p, 2000.f }})

请注意使用的额外花括号组。最外面的集合声明 std::intializer_list,每个内部集合声明列表中的每个 ChParam

关于c++ - 使用可变参数模板进行统一初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39640553/

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