2つ以上の関数例が与えられている場合、テンプレートパラメータとして提供される関数の引数を推測できるテンプレートコードを記述することは可能ですか?関数ポインタから引数リストを引き出す方法は?
これが動機の例です:/*???*/
の両方の用途で
void do_something(int value, double amount) {
std::cout << (value * amount) << std::endl;
}
void do_something_else(std::string const& first, double & second, int third) {
for(char c : first)
if(third/c == 0)
second += 13.7;
}
template<void(*Func)(/*???*/)>
struct wrapper {
using Args = /*???*/;
void operator()(Args&& ... args) const {
Func(std::forward<Args>(args)...);
}
};
int main() {
wrapper<do_something> obj; //Should be able to deduce Args to be [int, double]
obj(5, 17.4); //Would call do_something(5, 17.4);
wrapper<do_something_else> obj2; //Should be able to deduce Args to be [std::string const&, double&, int]
double value = 5;
obj2("Hello there!", value, 70); //Would call do_something_else("Hello there!", value, 70);
}
、私はこの種のコードを可能にすることが置くことができるものを仕事にしようとしています。
Args
が最初に使用される前に定義されていないため(次のような多くの構文エラーがあると思われます)、次のコードは機能していません。自分のタイプの明示的な書き込みを必要としないバージョン:
template<void(*Func)(Args ...), typename ... Args)
struct wrapper {
void operator()(Args ...args) const {
Func(std::forward<Args>(args)...);
}
};
wrapper<do_something, int, double> obj;
http://en.cppreference.com/w/ cpp/utility/functional/function)? – bolov
@bolov私が特に探しているのは、提供された 'Function'から' Args'を推論する方法です。 'std :: function'は、型パラメータリストに明示的に指定された型を持つことによって、関数ポインタを照合します。 – Xirema
あなたはC++ 17を受け入れますか? wink wink – bolov