意思是?,c++,templates,sfinae,member-pointers"/>

首页 > 解决方案 > 什么是模板意思是?

问题描述

我正在阅读这个史前元程序示例来检测一个类是否支持成员查找。(或任何其他成员)。

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 天后从头开始写同样的东西,我可能会失败。
原因是我不完全理解这里使用的句法和语言延伸。
有人可以解释以下语法的含义吗?

  1. Check<int Fallback::*, &U::find>* (我知道它在这里试图从 SFIAN 中受益,但是这是如何检测到 find 的存在,我相信这也与第二个问题有关)
  2. template<typename U, U> struct Check;

程序按预期输出 0 1 ;

标签: c++templatessfinaemember-pointers

解决方案


template<typename U, U>表示有两个模板参数:一个任意类型 U,以及一个类型为 U 的未命名的非类型模板参数(例如值参数)。例如,int场景是ClassName<int,42>.

在您的示例中,类型U是指向int成员的指针,值是int成员的地址。


推荐阅读