2016-12-31 4 views
9

私が知っている値を返し、パラメータ知られており、どこかxと呼ばれる機能があります。テンプレートで使用する関数の戻り値の型を取得するにはどうすればよいですか?

int x(int y); 

私がどこかに持っているが、私は、この関数の呼び出しnを格納するためのコンテナを作成します。それから私は何度もそれを実行したい。

問題は、返信タイプがintであることに頼りたくありません。私はコンパイル時に戻り値の型を推論する必要があります。次のようなものがあります。

std::vector<result_of<x(int)>::type> results; 

しかし、パラメータ値が静的であるため、パラメータ値を指定する必要はありません。

+0

[このStackOverflowの質問](http://stackoverflow.com/questions/11310898/how-do-i-get-the-type-of-a-variable)あなたの質問に答えるかもしれません。 – Nietvoordekat

+0

ここで解決策を見てみることができます:http://stackoverflow.com/a/41301717/2378300 – Jonas

答えて

6

あなたがあなた自身の特性を作成することができ、何かのように:

template <typename F> struct my_result_of; 

template <typename F> struct my_result_of<F*> : my_result_of<F> {}; 

template <typename Ret, typename ... Ts> 
struct my_result_of<Ret(Ts...)> 
{ 
    using type = Ret; 
}; 

template <typename F> using my_result_of_t = typename my_result_of<F>::type; 

そして(何xのオーバーロードがないと仮定して)のようにそれを使用する:私はあなたが最も最近まで使用できると仮定し

std::vector<my_result_of_t<decltype(x)>::type> results; 
5

あなたは近くです。 Tと仮定すると、呼び出し元関数のテンプレート引数である:

std::vector<decltype(x(std::declval<T>()))> results; 
+1

[これは動作しません。](http://coliru.stacked-crooked.com/a/755fc639873ce270)あなたはあなたのソリューションをテストしますか? – cpplearner

+1

@cpplearner:あなたのポイント。それがresult_ofの仕組みではありません。 'decltype'に変更されました。 – erenon

+0

"呼び出し側関数のテンプレート引数"? 'x'を呼び出す関数はテンプレート引数を持ちません。 – NeomerArcana

2

あなたがstd::function::result_type乱用することができます:xが本当に機能である場合にのみ動作します。もちろん、

int x(int y); 
static_assert(std::is_same_v<int,std::function<decltype(x)>::result_type>); 

を。 xが任意の関数オブジェクトである場合、結果の型は引数の型に依存することがあります。その場合、引数を指定せずに結果の型を知ることはできません。

2

をあなたがそれを指定していないため、標準リビジョンです。あなたの関数の

#include<vector> 
#include<functional> 
#include<utility> 

template<std::size_t... I, typename F, typename... A> 
auto gen(std::index_sequence<I...>, F &&f, A... args) { 
    return std::vector<decltype(std::forward<F>(f)(args...))>{ 
     (I, std::forward<F>(f)(args...))... 
    }; 
} 

template<std::size_t N, typename F, typename... A> 
auto gen(F &&f, A... args) { 
    return gen(std::make_index_sequence<N>{}, std::forward<F>(f), args...); 
} 

int f(int, char) { return 0; } 

int main() { 
    auto vec = gen<10>(&f, 0, 'c'); 
} 

戻り値の型により容易に推測されています:

decltype(std::forward<F>(f)(args...)) 

I nは、この関数の呼び出しを格納するためのコンテナを作成したい。ここ
は最小限、実施例です。それから私は何度もそれを実行したい。

これを行うには、std::index_sequenceを使用して、適切なサイズのパラメータパックを作成しました。

(I, std::forward<F>(f)(args...))... 

基本的な考え方は、上記パラメータパックを解凍し、N倍機能を実行するためのカンマ演算子を利用することである:それは次のように
そしてベクター自体が初期化されます。呼び出すことによって返された値fは、ベクトルを埋めるために使用されます。

argsが完全にfに転送されていないことに注意してください。
最初の実行中に移動可能なオブジェクトが消費された場合に問題を引き起こす可能性があります。

関連する問題