Uniform initialization with variation patterns

I have a POD ChParamand this is a parameter in the function of the variation template set. I would like to pass function arguments (constructor parameters) to curly braces p.set({ Param::D, 1000.f }, { Param::p, 2000.f }). And I thought that the constructor would be called implicitly, and objects would be created ChParam. But this is not possible, I have to explicitly create an objecta.set(ChParam{ Param::D, 1000.f }, ChParam{ Param::p, 2000.f });

Is it possible to use the option in some way 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;
}
+4
source share
1 answer

Unable to use

{ 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 .

+6

Source: https://habr.com/ru/post/1655484/


All Articles