通用模板二传手

时间:2017-04-04 17:01:47

标签: c++ templates

在我们的程序中,我们希望使用模板化函数来设置所有成员。每个成员都有一个关联的枚举,也用于本类的其他部分。这是班级:

class MyClass {
public:
    // Set function here

private:
    std::string _name;
    unsigned _capacity, _computers;
}

我们想要使用的理想解决方案看起来像这样:

template<Trait trait, typename Value>
void set(Value&& val) {
    switch (trait) {
    case Trait::name:
        _name = std::forward<Value>(val);
        break;
    case Trait::capacity:
        _capacity = std::forward<Value>(val);
        break;
    case Trait::computers:
        _computers = std::forward<Value>(val);
        break;
    }
}

会像这样调用:

MyClass a;
a.set<Trait::name>("Name");
a.set<Trait::capacity>(100);

最接近这一点,我们得到的是特质类型的多个专业化:

template<Trait trait>
void set(unsigned val) {
    switch (trait) {
    case Trait::capacity:
        _capacity = val;
        break;
    case Trait::computers:
        _computers = val;
        break;
    default:
        throw std::logic_error("Can't set this");
    }
}

虽然这是有效的,但使用按值模板化的单个函数会更好。我们得到的错误是在switch语句编译器中无法将const char *转换为unsigned,即使它永远不会到达该语句。

可以用constexpr写一下,但是我们很可能不能使用它(VS17)。

它可以在一个setter中实现,由使用的特性和它的类型模板化吗?

0 个答案:

没有答案