jpo*_*o38 6 c++ templates variadic-templates c++11
我有许多非常相似的函数,但使用不同数量和类型的本地对象运行:
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" } );
Run Code Online (Sandbox Code Playgroud)
variadic模板会帮助我实现这些函数的重构吗?
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" } );
Run Code Online (Sandbox Code Playgroud)
已检查如何迭代打包的可变参数模板参数列表?并迭代可变参数模板的类型参数但没有成功.看不出我怎么能创建不同种类的可变数量的本地对象......
Bar*_*rry 10
首先,不要把你的名字作为一个vector.将它们作为参数包.而且,将它们作为你真正想要的东西包装:
bool is_valid() { return true; }
template <class T, class... Ts>
bool is_valid(T& arg, Ts&... args) {
return arg.valid() && is_valid(args...);
}
template <class T, class... Args>
T* create(Args&&... args) {
if (is_valid(args...)) {
return new T{args...};
}
else {
return nullptr;
}
}
Run Code Online (Sandbox Code Playgroud)
现在只需传递正确的内容:
create<T>(A{"nameA"}, B{"nameB"}, C{"nameC"});
create<T>(D{"nameD"}, E{"nameE"});
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因,你真的想要分离类型和名称,你也可以这样做:
template <class T, class... Cs, class... As>
T* create_classes(As&&... args) {
return create<T>(Cs{std::forward<As>(args)}...);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1926 次 |
| 最近记录: |