私は答えhttps://stackoverflow.com/a/7943765/7006673で発生し、次のコードテンプレートの特殊
template <typename T>
struct function_traits
: public function_traits<decltype(&T::operator())>
{};
// For generic types, directly use the result of the signature of its 'operator()'
template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) const>
// we specialize for pointers to member function
{
// ...
}
int main()
{
auto lambda = [](int i) { return long(i*10); };
typedef function_traits<decltype(lambda)> traits;
// ...
return 0;
}
を理解する難しさを持っています。ここで
、
template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) const>
は
template <typename T>
struct function_traits
テンプレートクラスの特殊化を示しているようだが、専門template <typename ClassType, typename ReturnType, typename... Args>
のテンプレートパラメータリストは(すなわち、template <>
と等しくない空ではありません)。 誰かが理解してもらえますか?これはどのような特殊化ですか、テンプレートパラメータClassType
,ReturnType
、Args
はどのように導き出されますか?
事前に感謝します。
ありがとうございます。 1つの質問が残っています:タイプ控除は、関数のテンプレートパラメータに対してのみ行うことができ、構造体やクラスのものではないと思いました。間違っていますか? –
暗黙的なインスタンス化は、関数のテンプレートパラメータに対してのみ実行できます。関数を呼び出すときに引数を明示的に渡すため、その型を暗黙的に推論することができます。ここで 'function_traits'は 'T = decltype(lambda)'を使った明示的なインスタンス化です –
wasthishelpful
ありがとう! 'decltype(lambda)'はテンプレートパラメータなので、 'returnType'、' ClassType'、 'Args'を' decltype(lambda) 'に基づいて減算することができます。 –