这里的问题是X<int>
and x<char>
是完全不相关的类型。
事实上,它们都是同一个模板类的结果,这一点在这里没有帮助。
我可以看到几种解决方案,但这些取决于您真正需要的。
例如,您可以使X<>
实例派生自公共非模板化基类,该基类具有print()
方法(最终作为纯虚拟)。但在这样做之前,请确保它在功能层面上有意义:人们应该使用继承,因为它有意义,而不仅仅是因为技术限制。如果你这样做,你可能也会想要一个虚拟析构函数。
您还可以绑定并存储std::function<void ()>
到您要调用的方法,但确保对象仍然“活动”(它们不在您当前的代码中:两个X<int>
and X<char>
当它们超出范围时,在您实际调用之前就被销毁print()
).
最终的解决方案是制作一些与两者兼容的变体类型X<int>
and X<char>
(升压::变体可以在这里提供帮助)。然后您可以编写一个实现以下功能的访问者print()
每种类型的功能。
选择最后一个解决方案,它会变成这样:
typedef boost::variant<X<int>, X<char>> genericX;
class print_visitor : public boost::static_visitor<void>
{
public:
template <typename SomeType>
void operator()(const SomeType& x) const
{
// Your print implementation
// x is your underlying instance, either X<char> or X<int>.
// You may also make several non-templated overloads of
// this operator if you want to provide different implementations.
}
};
int main()
{
boost::optional<genericX> my_x;
if (type=="int") {
my_x = X<int>(a,b);
} else if(type=="char") {
my_x = X<char>(a,b);
}
// This calls the appropriate print.
if (my_x) {
boost::apply_visitor(print_visitor(), *my_x)
}
}
我们实际上缺乏给出明确答案的知识:如果您的类是“实体”,那么您可能应该选择继承。如果它们更像“值类”,那么变体方式可能更适合。