在我们的程序中,我们希望使用模板化函数来设置所有成员。每个成员都有一个关联的枚举,也用于本类的其他部分。这是班级:
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中实现,由使用的特性和它的类型模板化吗?