2017-02-28 10 views
8

テンプレートを扱う際に私が悩まされた小さな問題に直面しました。ここでは一例です:私は_returnTypeを必要はありませんテンプレートパラメータとして関数ポインタを与えるので、しかし、それは関数のシグネチャですぐそこです、(あなたがそれを試してみたい場合はhttp://cpp.sh/テンプレート関数のポインタとしてのテンプレート関数

template<class _returnType, _returnType (*_function)()> 
_returnType aliasGetter() { return _function(); } 
int getCoolNumber() { return 42; } 
int main() 
{ 
    std::cout << aliasGetter<int, &getCoolNumber>(); //42 
} 

このコードは動作しますが、問題は、私が試してみても、この追加のテンプレートパラメータを取り除く方法を見つけることができないということです。

aliasGetterは、テンプレートパラメータ(ゲッタのエイリアスへのポインタ)を1つだけ取ることができますか? それができないのなら、どうしてですか? C++ 17では

+0

1つのテンプレートパラメータを使用して、テンプレート引数の減算に頼ってはどうですか? – WhiZTiM

+1

@WhiZTiMこれは、実行時に関数ポインタを呼び出しに渡す必要があります。 –

+0

2番目のテンプレートパラメータがそれに依存しているため、これが必要です。 https://functionalcpp.wordpress.com/2013/08/05/function-traits/で何かを構築するかもしれませんが、テンプレートパラメータを保存することはできません。 – knivil

答えて

14

、それは、template autoのおかげで可能になります:

template <auto F> std::invoke_result_t<F> aliasGetter() { return F(); } 

C++ 17の前に、それは不可能です。非タイプのテンプレートパラメータのタイプを指定する必要があります。そのための手段はありません。ファンクション・テンプレートを介してファンクション・ポインタを渡すことができないので、ファクトリをファクトリとして作成することはできません。あなたは手動でそれを2回入力することなく、あなたの関数ポインタの型を取得します

template <class T, T F> std::result_of_t<T()> aliasGetter() { return F(); } 
#define TEMP_ALIAS(x) decltype(x), x 

std::cout << aliasGetter<TEMP_ALIAS(&getCoolNumber)>(); 


C++ 14での最短回避策は、ため息、マクロを使用することです。

+1

あなたが記述した新しい構文のおかげで、C + 17で可能であることはわかっていましたが、おそらく、この魔法のトリックなしで行うことができると思いました。 – Nyashes

+0

C++で 'std :: result_of'が[廃止予定](http://en.cppreference.com/w/cpp/types/result_of)である場合は、' std :: invoke_result代わりに。 –

関連する問題