这是我想做的:

ExampleTemplate* pointer_to_template;
cin >> number;
switch (number) {
case 1:
    pointer_to_template = new ExampleTemplate<int>();
    break;
case 2:
    pointer_to_template = new ExampleTemplate<double>();
    break;
}
pointer_to_template->doStuff();

这不会编译,因为在声明指针时必须指定模板类型。 (ExampleTemplate* pointer_to_template应该是ExampleTemplate<int>* pointer_to_template。)不幸的是,直到在switch块中声明了模板,我才知道模板的类型。在这种情况下,最好的解决方法是什么?

最佳答案

你不能ExampleTemplate<int>ExampleTemplate<double>是两种不同的,不相关的类型。如果您始终可以切换多个选项,请改用boost::variant

typedef boost::variant<Example<int>, Example<double>> ExampleVariant;
ExampleVariant v;
switch (number) {
    case 1: v = Example<int>(); break;
    case 2: v = Example<double>(); break;
}
// here you need a visitor, see Boost.Variant docs for an example

另一种方法是使用具有虚拟公共(public)接口(interface)的普通基类,但我更喜欢variant
struct BaseExample {
    virtual void do_stuff() = 0;
    virtual ~BaseExample() {}
};

template <typename T>
struct Example : BaseExample { ... };

// ..
BaseExample *obj;

08-17 03:16