c++ 在同一函数上使用扩展包调用函数

fnvucqvd  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(216)

我希望能够通过任意数量的参数调用一个函数,每个参数的值由另一个函数提供:

template <typename T, std::size_t N>
class MyClass
{
public:
    void doSomething()
    {
        doSomethingProxy(std::make_index_sequence<N>());
    }

private:
    template <std::size_t... I>
    void doSomethingProxy(std::index_sequence<I...>)
    {
        m_obj.doSomething({get()...}); // T::doSomething() expects an object whose constructor has N number of arguments, and I would like to call the get() function for each argument of said constructor, N times
    }
    
    int get() { return 0; }

    T m_obj{};
};

但是,执行上述操作会导致错误

error: expansion pattern get() contains no parameter packs

我认为问题是get()...不依赖于I,但我不确定如何解决这个问题。

rhfm7lfc

rhfm7lfc1#

(I,get())使用参数包,结果为get()(逗号运算符,计算两个操作数,返回rhs)。要使有关逗号运算符的lhs无效的警告静音,您可能需要编写((void)I,get())

#include <cstdint>
#include <utility>

template <typename T, std::size_t N>
class MyClass
{
public:
    void doSomething()
    {
        doSomethingProxy(std::make_index_sequence<N>());
    }

private:
    template <std::size_t... I>
    void doSomethingProxy(std::index_sequence<I...>)
    {
        m_obj.doSomething({ ((void)I,get())... }); 
    }
    
    int get() { return 0; }

    T m_obj{};
};

相关问题