【发布时间】:2017-04-02 10:33:15
【问题描述】:
我有许多功能非常相似,但使用不同数量和类型的本地对象运行:
template <class T> T* create1( const std::vector<std::string>& names )
{
A a( names[0] );
B b( names[1] );
C c( names[2] );
if ( a.valid() && b.valid() && c.valid() )
return new T( a, b, c );
else
return NULL;
}
template <class T> T* create2( const std::vector<std::string>& names )
{
D d( names[0] );
E e( names[1] );
if ( d.valid() && e.valid() )
return new T( d, e );
else
return NULL;
}
create1<ABC>( { "nameA", "nameB", "nameC" } );
create2<DE>( { "nameD", "nameE" } );
可变参数模板能帮助我实现对这些函数的重构吗?
template <class T, typename Args...> T* create()
{
// loop over Args and create 2 or 3 objects
// if (....valid())
// return T( ... );
// else
// return NULL;
}
create<ABC,A,B,C>( { "nameA", "nameB", "nameC" } );
create<DE,D,E>( { "nameD", "nameE" } );
检查How can I iterate over a packed variadic template argument list? 和iterating over variadic template's type parameters 没有成功。看不到如何创建数量可变的不同类型的本地对象...
【问题讨论】:
-
他们需要是本地对象吗?还是临时工好吗?
-
如果可能的话,我更喜欢本地的,因为实际上它们的创建可能会失败,然后导致函数提前返回。更新了帖子。
-
你为什么不检查向量名称的大小并做一个 if 语句?您只需一个函数即可完成所有这些操作。这不是可变参数模板的目的。也许你想使用cstdarg ?
-
std::tuple有什么问题? -
@W.F.:没什么,只是没想到 ;-)
标签: c++ c++11 templates variadic-templates