2016-04-03 15 views
4

申し訳ありませんが、タイトルは一口です。私は、hereと題されたものに似た配列クラスに取り組んでいます。私はユーザー定義の関数をとり、それを配列の各要素に適用する "マップ"関数を定義したいと考えています。型チェックの目的のために、私はそれは、このようなマップ関数に渡されるようバリデーショナルテンプレートクラスメソッドを作成するには関数の関数型を関数テンプレートから派生した型の引数として取る?

double f(double a, double b) { return a + b; } 
Array<double,2> x, y, z; x.map(f, y, z); 

がコンパイルされるように、ユーザが指定した機能、同じ数の引数を取らなければならないことを定義したいのですがしかし

double g(double a, double b, double c) { return a + b + c; } 
Array<double,2> x, y, z;. x.map(g, y, z); 

は、gはmap関数に渡されたものに基づいて、引数の数が間違っかかりbecuaseはありません。

私が試したような構文:私はそれがコンパイルされませんので、これは、近いが、明らかに間違っていると思う

template<typename T, size_t ... Ns> class Array 
{ 
    template<class ... Args> inline const Array<T, Ns...> 
     map(T (*fn)(decltype(Args, double)...), Args...) 
    { 
     // doesn't compile 
    } 
} 

。私はこのような操作の正しい構文を学ぶことに感謝します。

答えて

3
template <typename T, std::size_t ... Ns> 
struct Array 
{ 
    template <typename> 
    using arg_type = T; 

    template <class ... Args> 
    Array<T, Ns...> map(T (*fn)(arg_type<Args>...), Args...) 
    { 
     return {}; 
    } 
}; 

DEMO

+0

@Piotr_Skotnicki、あなたの迅速な答えてくれてありがとう!これはまさに私が必要としていたものです。私は今、そのような機能がどのように実装されるかを理解しようとしている。何か提案はありますか? – nosuchthingasstars

+0

@nosuchthingasstarsは、 'Array'の単純化された実装で新しい質問を提起してください –

関連する問題