10

C++ 11 の可変個引数テンプレートについて学習しようとしています。基本的に a のラッパーであるクラスがありますstd::arraystd::array関数オブジェクト (理想的にはラムダ) をメンバー関数に渡してから、関数オブジェクトのパラメーターとして渡された要素を取得できるようにしたいと考えています。

パラメータの数が配列の長さと一致することを確認するためにa を使用しstatic_assertましたが、要素を引数として渡す方法が思いつきません。

ここにコードがあります

#include <iostream>
#include <array>
#include <memory>
#include <initializer_list>

using namespace std;

template<int N, typename T>
struct Container {
    template<typename... Ts>
    Container(Ts&&... vs) : data{{std::forward<Ts>(vs)...}} {
        static_assert(sizeof...(Ts)==N,"Not enough args supplied!");
    }

    template< typename... Ts>
    void doOperation( std::function<void(Ts...)>&& func )
    {
        static_assert(sizeof...(Ts)==N,"Size of variadic template args does not match array length");

        // how can one call func with the entries
        // of data as the parameters (in a way generic with N)
    }

    std::array<T,N> data;
};

int main(void)
{
    Container<3,int> cont(1,2,3);

    double sum = 0.0;
    auto func = [&sum](int x, int y, int z)->void{
        sum += x;
        sum += y;
        sum += z;
    };

    cont.doOperation(std::function<void(int,int,int)>(func));

    cout << sum << endl;

    return 0;
}

だから私の質問(コードに示されているように)は、どのようにエントリをdata関数funcに渡すことができますNか?

おまけの質問: in mainへの見苦しい変換をなくしてstd::function、ラムダを直接渡すことは可能ですか?

4

2 に答える 2