我正在阅读这个史前元程序示例来检测一个类是否支持成员查找。(或任何其他成员)。
template<typename T>
class DetectFind
{
struct Fallback { int find; };
struct Derived : T, Fallback { };
template<typename U, U> struct Check;
typedef char Yes[1];
typedef char No[2];
template<typename U>
static No& func(Check<int Fallback::*, &U::find>*);
template<typename U>
static Yes& func(...);
public:
typedef DetectFind type;
enum { value = sizeof(func<Derived>(0)) == sizeof(Yes) };
};
int main()
{
std::cout << DetectFind<std::vector<int> >::value << std::endl;
std::cout<< DetectFind<std::set<int> >::value << std::endl;
}
直觉上我确实理解这背后的目的,但如果有人让我在 10 天后从头开始写同样的东西,我可能会失败。
原因是我不完全理解这里使用的句法和语言延伸。
有人可以解释以下语法的含义吗?
Check<int Fallback::*, &U::find>*
(我知道它在这里试图从 SFIAN 中受益,但是这是如何检测到 find 的存在,我相信这也与第二个问题有关)template<typename U, U> struct Check;
程序按预期输出 0 1 ;