【发布时间】:2020-03-31 17:58:44
【问题描述】:
最好用一些代码来解释:
class MyClass {
public:
MyClass(const std::string& d1, const std::string& d2, const std::vector<AorB>& d3) : data1(d1), data2(d2), data3(d3) {}
std::string getData1();
std::string getData2();
std::vector<AorB> getData3();
private:
std::string data1;
std::string data2;
std::vector<AorB> data3;
}
int main() {
MyClass myClassA("d1", "d2", std::vector<A>());
MyClass myClassB("d1", "d2", std::vector<B>());
A myA = myClassA.getData3();
B myB = myClassB.getData3();
}
当使用 boost 变体或 boost any 时,此工作流“几乎”有效,但我要避免的是调用 boost::get 以获取实际类型的 getData3 结果。换句话说,我不希望 MyClass 的使用者必须知道 A 或 B 是否存储在 data3 中。我只是希望他们能够调用 getData3(),它是在创建时传递的任何类型。
我认为可以通过具有模板专业化/递归继承的模板来实现,但我不太清楚如何让它发挥作用。也许它看起来像这样?
class MyClass {
public:
template <typename AorB>
MyClass(const std::string& d1, const std::string& d2, const std::vector<AorB>& d3) : data1(d1), data2(d2), data3(d3) {}
std::string getData1();
std::string getData2();
template <typename AorB>
std::vector<AorB> getData3();
private:
std::string data1;
std::string data2;
template <typename AorB>
std::vector<AorB> data3;
}
int main() {
MyClass myClassA<A>("d1", "d2", std::vector<A>());
MyClass myClassB<B>("d1", "d2", std::vector<B>());
A myA = myClassA.getData3();
B myB = myClassB.getData3();
}
但是这行不通,因为我们不能有非静态模板类成员。
【问题讨论】:
-
您是要复制
std::vector<std::variant<A, B>>还是std::variant<std::vector<A>, std::vector<B>>? -
A和B是否继承自一个共同的基础?如果不是,我真的不明白“我不希望 MyClass 的消费者必须知道 A 或 B 是否存储在 data3 中”,因为一旦他们调用getData3,用户就知道它是什么类型
标签: c++ class templates variant any