私は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;
}
['std :: initializer_list'](http://en.cppreference.com/w/cpp/utility/initializer_list)を使用してみませんか? – NathanOliver