2017-04-21 11 views
1

関数ftransform関数を使用してWrapperに変換できる引数を受け取り、f2を呼び出す必要があります。 f2は、Wrapperのような引数の可変数を受け取ります。別の関数を呼び出すために、バリデリックなテンプレート引数を別の型に変換するにはどうすればよいですか?

template <typename T> 
Wrapper transform(T&& value) { 
    return Wrapper(std::forward<T>(value)); 
} 

template <typename... Args> 
Wrapper f2(Args&&... args) { 
    // All arguments must be Wrappers 
    // More code 
} 

template <typename... Args> 
Wrapper f(Args&&... args) { 
    // Arguments can be transform to Wrapper using a transform function. 
    return f2(/* For each arg in args -> transform(std::forward<Args>(args)...)*/); // Problem! 
} 

通常は前のパラメータを変換することであり、直接f2を呼び出すことが、私は国民にtransform機能を公開する必要はありません。

これを実現する方法はありますか?transformが公開されていませんか?

+2

return f2(transform(std :: forward (args))...)を試しましたか? – linuxfever

+1

@ chema989 - 申し訳ありませんが、私はundestand ... linuxfeverからの提案は正しいと思われます: 'f2(transform(std :: forward (...))、' f2() '一連の 'wrapper'を使って' f2() 'の署名に完全にマッチします。 – max66

+0

@ max66あなたの答えを確認します。 – chema989

答えて

1

トランスフォーム機能を公開することなく、これを達成する方法はありますか?

ラムダ関数の使用はどうですか?

template <typename... Args> 
Wrapper f(Args&&... args) 
{ 
    static const auto tf = [](auto && value) 
    { return Wrapper(std::forward<decltype(value)>(value)); }; 

    return f2(tf(std::forward<Args>(args)) ...); 
} 

あなたはC++ 14だから、ラムダ関数でauto引数を使用することができ

別の解決策(またC++ 11)ファンクタを使用することができる(fc代わりf

をタグ付けすることを確認し
class fc 
{ 
    private: 
     template <typename T> 
     Wrapper transform (T && value) 
     { return Wrapper(std::forward<T>(value)); } 

    public: 
     template <typename... Args> 
     Wrapper operator() (Args&&... args) 
     { return f2(transform(std::forward<Args>(args)) ...); } 
}; 

しかし、使用が若干異なります。あなたは、一時的なオブジェクトを作成することができます(ただし、括弧の別のカップルを使用して

fc()(1, "abc", 2.3f); 

か、タイプfcのオブジェクトを作成し、パックの拡大が任意の複雑な式に適用することができます

fc f0; 

f0(1, "abc", 2.3f); 
+0

ありがとう@ max66。私は 'C++ 14 'を使用しています。ラムダ関数は良い選択です。 – chema989

+0

申し訳ありません:downvoterはdownwoteを説明できますか? – max66

2

機能として使用することができます。ここでは:

return f2(/* For each arg in args -> transform(std::forward<Args>(args)...)*/); // Problem! 

問題は、あなたがtransformの内部を拡大しているということです...それはf2(transform(a0, a1, a2, ..., aN))を書くのと同等です。なぜそれが間違っているのかは分かりません。展開する表現をにする場合は、transformが含まれます。つまり、

return f2(transform(std::forward<Args>(args))...); 

f2(transform(a0), transform(a1), ..., transform(aN))に展開されます。

+0

はい、私のエラーでした。パック展開には 'transform'が含まれていなければなりません。ありがとう@バリー – chema989

関連する問題