c++ - 什么是模板意思是?
问题描述
我正在阅读这个史前元程序示例来检测一个类是否支持成员查找。(或任何其他成员)。
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 ;
解决方案
template<typename U, U>
表示有两个模板参数:一个任意类型 U,以及一个类型为 U 的未命名的非类型模板参数(例如值参数)。例如,int
场景是ClassName<int,42>
.
在您的示例中,类型U
是指向int
成员的指针,值是int
成员的地址。
推荐阅读
- angular - Angular 4 Call HttpResponse inside the component
- android - Android: Text Input Layout: How to change the height if the Edit Text Line
- hyperledger-fabric - Invoke Chaincode
- vue.js - 在 vue.js 组件中扩展以使用父样式
- javascript - How to remove multi nested object in javascript using id
- python - Nuitka 依赖错误
- python - 如何在pygame中同时执行两个事件?
- c# - 当数据库在后台进行更新时,如何让我的 UI 响应按钮点击?
- botframework - 如何清除 Bot Builder SDK for .NET 中的消息
- javascript - 如何使用特定字符的索引搜索特定单词的索引