【发布时间】:2021-10-29 22:21:08
【问题描述】:
我正在阅读这个史前元程序示例,以检测一个类是否支持成员查找。 (或任何其他成员)。
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>*(我知道它在这里试图从 SFIANE 中受益,但是这是如何检测到 find 的存在,我相信这也与第二个问题有关) template<typename U, U> struct Check;
程序输出预测的0 1;
【问题讨论】:
标签: c++ templates sfinae member-pointers