Вероятно, лучше всего объяснить с помощью некоторого кода:
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 любого, но я стараюсь избегать вызова 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();
}
Однако это не сработает, потому что у нас не может быть нестандартных c членов класса шаблона.