如何迭代可变模板参数来创建可变数量的局部变量
How to iterate through variadic template parameters to create variable number of local variables?
我有许多非常相似的函数,但运行在不同数量和类型的局部对象上:
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" } );
选中我如何迭代一个打包的可变模板参数列表?并且迭代可变的模板's类型参数没有成功。
首先,不要把你的名字当作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;
}
}
现在传入正确的内容:
create<T>(A{"nameA"}, B{"nameB"}, C{"nameC"});
create<T>(D{"nameD"}, E{"nameE"});
如果出于某种原因,您确实希望将类型和名称分开,您也可以这样做:
template <class T, class... Cs, class... As>
T* create_classes(As&&... args) {
return create<T>(Cs{std::forward<As>(args)}...);
}
相关文章:
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 使用的未初始化局部变量'Quick'
- 修复未初始化的局部变量错误
- 为什么我们再次从结构对象创建结构变量?
- 局部变量保留函数中的值
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- 我创建的类似乎错误地设置了它的局部变量
- 如果对象是通过 new 创建的,则成员函数的局部变量在哪里创建?
- 在c++上创建税务计算程序,错误为未初始化的局部变量
- 如何在 llvm 中创建命名局部变量
- 为变量创建局部别名会增加开销吗?
- 用C语言创建具有局部变量的类C++模板函数
- 要创建持久变量,最好是使用局部静态变量还是全局变量
- 如何迭代可变模板参数来创建可变数量的局部变量
- 直接使用函数参数vs创建局部变量
- 局部变量-重新创建
- 创建对象,局部变量vs右值引用
- 通过创建局部变量减少堆栈指针
- 我可以创建一个局部变量的boost::shared_ptr吗