【发布时间】:2014-09-01 10:44:00
【问题描述】:
简介
我正在寻找一种模式来将 C++ 类型特征转换为它们的可变参数。解决问题的方法将受到赞赏,而自动化任务的生成式编程模式将是理想的。
示例
采取以下措施:
std::is_same<T, U>::value;
我想写一个像这样工作的特征:
std::are_same<T1, T2, T3, T4>::value;
目前的做法
实现are_same 很漂亮straightforward; 寻求一个通用的解决方案,我们可以为实现通用量化的任何可变参数特征提供一个工具:
template<template<class,class> class F, typename...Ts>
struct Univ;
template<template<class, class> class F, typename T, typename U, typename...Ts>
struct Univ<F, T, U, Ts...>
{
static const int value = F<T, U>::value && Univ<F, U, Ts...>::value;
};
template<template<class, class> class F, typename T>
struct Univ<F, T>
{
static const int value = 1;
};
所以例如are_same 可以是written as
Univ<is_same,int, int, int>::value
这可能适用于创建 are_classes、are_scalars 等特征时
概括
细微的调整可以让 existential quantification 脱离之前的 sn-p(将 && 替换为 ||),以便我们以以下方式创建像 exist_same 这样的特征:
Exist<is_same, int, double, float>::value
问题
上一篇关于type traits的封面概括与
- 主要类型类别
- 复合类型类别
- 类型属性
- 支持的操作
我将如何概括类型特征,如下所示:
enable_if -> enable_if_any // enable if any clause is true
enable_if_all // enalbe if all clauses are true
enable_for // enable only for the type provided
上面的exist_same 示例过于简单。有正确实施的想法吗?
有 type_traits 可以“返回”修改后的类型。有什么建议可以将它们扩展到任意数量类型的实现吗?
是否存在 type_traits,它们 不能扩展到任意数量的类型参数?
【问题讨论】:
-
对于“返回多种类型”:只能返回一种顶级类型。要返回类型列表,通常使用
std::tuple< T1, T2, ... >。 -
这样的东西让我想要
template相当于using——template<template<class,class>class F>using for_all=template<class...Ts>Univ<F,Ts...>;,像for_all<std::is_same><int,int,int>一样使用,它可以让你轻松地将生成的template<class...>传递给其他元没有丑陋的编程。 -
Univ 是一个非常有用的工具。我想知道您是否可以提供
Exist的实现
标签: c++ templates c++11 template-meta-programming generative-programming