gpt4 book ai didi

c++ - C++14 中的模板到模板映射

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:55 25 4
gpt4 key购买 nike

我想在 C++14 中做一个模板到模板的映射。先验地,似乎以下代码可以解决问题

template<class T>
struct KeyType {};

template<class T>
struct ValueType {
T x;
};

template<template<class> class K>
struct Map;

template<>
struct Map<KeyType> {
template<class T>
using type = ValueType<T>;
};

ValueType<int> test{42};
Map<KeyType>::type<int> testM{42}; // Same as above

但是,以下表达式在使用 clang++ v3.8 编译时返回 false。

template<template<class> class TemplateType>
struct NeedsTemplate;

std::is_same<
NeedsTemplate<ValueType>,
NeedsTemplate<Map<KeyType>::type>
>::value; // False

我明白为什么它是假的:it has already been answered here .基本上,该标准确保别名的模板实例化应该被识别为相同的,但没有提及模板本身。因此,对于 g++std::is_same 为真,而对于 clang++,则为假。

我的问题是:如何使用 g++ 和 clang++ 实现满足 std::is_same 要求的模板到模板映射?我愿意使用宏作为最后的手段......

最佳答案

不要使用模板作为元编程原语。使用类型。类似的,避免值(value)观。

template<template<class...>class Z>
struct ztemplate{
template<class...Ts>
using apply=Z<Ts...>;
};
template<class Z, class...Ts>
using apply=typename Z::template apply<Ts...>;
using zapply=ztemplate<apply>;

你永远不会使用原始的 template s,只是ztemplate

template<class T>
struct KeyType {};
using zKeyType=ztemplate<KeyType>;

C++ 元编程可以更好地处理类型。如果你想限制你的类型(比如它必须是 ztemplate )写 SFINAE 或伪概念来强制执行它。

作为奖励,ztemplate是定义模板的。这让您了解 hana 风格的元编程。

这确实意味着您必须规范地包装您的模板代码,并去除直接模板和值参数(分别替换为 ztemplate 和整数常量)。但是您最终会得到更强大的元编程。

而不是 X<Blah>apply<zX, Blah> .实际上,apply成为您直接使用的唯一模板。

备注apply<zapply, zX, Blah>apply<zapply, zapply, zX, Blah>等与apply<zX, Blah>相同.

关于c++ - C++14 中的模板到模板映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41538797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com