可以使用灵活的参数列表创建模板方法,如下所示:
class TestA
{
public:
TestA(int i, int j) { ... }
}
class TestB
{
public:
TestB(std::string a) { ... }
}
class Base
{
public:
template<class T>
bool add( ... )
{
... new T( **PARA** );
}
}
将 PARA 替换为参数列表。 TestA和TestB类知道它们需要哪个参数(参数和类型的数量),以便用va_args实现?
有更好的方法吗?
base.add<TestA>(1,2);
base.add<TestB>( "abc" );
答案 0 :(得分:7)
是的,您正在寻找variadric templates。它们将让您拥有您想要的功能:
template<class T, class... Args>
bool Base::add(Args&&... args) {
// ...
T myT(std::forward<Args>(args)...);
// ...
}
请注意,即使您的参数都不是右值引用,您仍然应该同时使用Args&&
和std::forward
(当然,除非您明确要强制执行副本)。这些将根据需要折叠成适当的引用类型。