如何将捕获的参数用于构造函数,并随后在另一个构造函数中使用这些参数?

问题描述 投票:0回答:1

考虑一个类

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。

c++ c++17
1个回答
0
投票

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

演示

© www.soinside.com 2019 - 2024. All rights reserved.