【发布时间】:2017-01-04 03:58:49
【问题描述】:
我有两个 C++ 抽象类 Abs1 和 Abs2。然后我有:
`A : public Abs1`
`B : public Abs1`
`C : public Abs2`
`D : public Abs2`
现在,我正在尝试create objects from command line arguments,我必须重写链接问题中的公共工厂函数make_abstract,例如:
std::unique_ptr<Abs1> makeAbs1 (int argc, const char*argv[])
{
if (argc == 1) {
return nullptr;
}
const std::string name = argv[1];
if (name == "A") {
return detail::make_abstract<A, std::tuple<int, std::string, int>>(argc, argv);
} else if (name == "B") {
return detail::make_abstract<B, std::tuple<int, int>>(argc, argv);
}
}
std::unique_ptr<Abs2> makeAbs2 (int argc, const char*argv[])
{
if (argc == 1) {
return nullptr;
}
const std::string name = argv[1];
if (name == "C") {
return detail::make_abstract<C, std::tuple<int>>(argc, argv);
} else if (name == "D") {
return detail::make_abstract<D, std::tuple<int, float>>(argc, argv);
}
}
如您所见,这是非常多余的。我该如何做这个的通用版本?在这个版本中,我们可以传递任意数量的实现类,因此if 级联不是解决方案。请注意,我们不能修改任何这些类。
我在想也许可变参数模板会有所帮助,但我想不出很多问题:
template <typename T, typename ...Ts>
std::unique_ptr<T> make (int argc, const char*argv[]){
const std::string name = argv[1];
for(Ti : Ts) //this is obviously wrong
if(typeid(Ti).name == name)
return detail::make_abstract<T, std::tuple</*Here shoudl be different for every Ti*/>>(argc, argv);
}
【问题讨论】:
-
你不能把不相关的类型塞进一个返回类型。在呼叫站点会是什么样子?要么需要一个共享基类,要么需要一个联合(或 std::any 等)才能使 make 可用
标签: c++ c++11 abstract-class