考虑一个类
Base
,它有许多构造函数,每个构造函数都有不同的类型。唯一共同的就是每个构造函数的倒数第二个参数。我在使用函数 get_penultimate
的过程中获取了此参数的副本,并将其分配给 m_foo
,其详细信息与此处无关。
我写了一个课程
Child
:
template<class Base>
class Child : public Base
{
public:
template <typename... Args>
Child(Args&&... args) :
Base(std::forward<Args>(args)...),
m_foo(get_penultimate(std::forward<Args>(args)...))
{
// Store the arguments in m_args
(this->m_args.emplace_back(std::forward<Args>(args)), ...);
}
std::vector<std::any> m_args;
FooType m_foo;
};
我想要做的是使用
Base
创建 m_args
的新实例。 (实际上,我通过更改 m_args
并调整 m_foo
来更改 std::vector
的倒数第二个参数)。但是m_args
无法完美转发。
这个想法是在
Child
: 中有一个函数
template <typename... Args>
Base createBase() const
{
return Base(std::forward<Args>(m_args)); // Not allowed
}
我该怎么做?我正在使用 C++17。
std::vector::size
是运行时信息,并且您还会丢失类型信息。你可以存储一个工厂来代替(std::function<Base()>
):
template<class Base>
class Child : public Base
{
public:
template <typename... Args>
Child(Args&&... args) :
Base(std::forward<Args>(args)...),
factory{
[&]<std::size_t...Is>(std::index_sequence<Is...>){
return [=](){
return Base(std::get<Is>(std::tie(args...))..., 42);
};
}(std::make_index_sequence<sizeof...(Args) - 1>{})
}
{
}
std::function<Base()> factory;
};