template<typename T, T> 是什么意思?
我正在阅读这个史前元程序示例来检测一个类是否支持成员查找。(或任何其他成员)。
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 如预测;
回答
template<typename U, U>意味着有两个模板参数:一个任意类型 U 和一个未命名的非类型模板参数(例如一个值参数),其类型为 U。例如,一个int场景是ClassName<int,42>.
在您的示例中,类型U是指向int成员的指针,值是int成员的地址。