SFINAEの仕組みを理解しようとしています。SFINAEを使用してメンバー機能をチェックして電話する
私のニーズ:
私はactivate
と呼ばれるメンバ関数を提供したりしないことがありタイプのセットを持っています。指定された型に対してactivate
が存在する場合は、引数を受け入れることができます。私は、型のactivate
が存在する場合はそれを転送する関数を書いています。それ以外の場合は単にreturn true
です。
私が試した:
#include <iostream>
#include <utility>
#include <functional>
struct A
{
bool activate()
{
std::clog << "A::activate() called" << std::endl;
return true;
}
bool activate(const char*)
{
std::clog << "A::activate(const char*) called" << std::endl;
return true;
}
};
struct B
{
// NOTHING
};
template<class S, class... ARGS>
auto activate(S& s, ARGS&&... p_args) -> typename std::invoke_result<decltype(&S::activate)(S, ARGS...)>::type
{
return s.activate(std::forward<ARGS>(p_args)...);
}
bool activate(...)
{
return true;
}
int main(int argc, char* argv[])
{
A a;
B b;
activate(a);
activate(a, "Hello");
activate(b);
return 0;
}
をしかし、何も今までに印刷されません。どうして?
私はまだ 'invoke_result'が' result_of'と同じ構文をしていないのを見たことがありません。そして、ええ、アドレスのために、それは理にかなっています。ありがとうございました。 –