如何迭代可变模板参数来创建可变数量的局部变量

How to iterate through variadic template parameters to create variable number of local variables?

本文关键字:创建 局部变量 参数 何迭代 迭代      更新时间:2023-10-16

我有许多非常相似的函数,但运行在不同数量和类型的局部对象上:

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)}...);
}