【发布时间】:2015-11-10 11:01:58
【问题描述】:
我正在尝试编写一个 Bind 元编程模板帮助器元函数,它将模板参数绑定到某些东西。
我有一个简单模板元函数的工作实现:
template<typename T0, typename T1>
struct MakePair
{
using type = std::pair<T0, T1>;
};
template<template<typename...> class TF, typename... Ts>
struct Bind
{
template<typename... TArgs>
using type = TF<Ts..., TArgs...>;
};
using PairWithInt = typename Bind<MakePair, int>::type;
static_assert(std::is_same<PairWithInt<float>, MakePair<int, float>>{}, "");
但是如果MakePair 的模板参数是模板模板呢?还是简单的数值?
template<template<typename> class T0, template<typename> class T1>
struct MakePair0
{
using type = /*...*/;
};
template<template<typename...> class TF, template<typename> class... Ts>
struct Bind0 { /*...*/ }
// ...
template<int T0, int T1>
struct MakePair1
{
using type = /*...*/;
};
template<template<int...> class TF, int... Ts>
struct Bind1 { /*...*/ }
很多不必要的重复。如果模板参数在类型、模板模板和整数常量之间混合使用,则会变得难以管理。
下面的代码可以吗?
template<template<ANYTHING...> class TF, ANYTHING... Ts>
struct BindAnything
{
template<ANYTHING... TArgs>
using type = TF<Ts..., TArgs...>;
};
ANYTHING 将接受类型、模板模板、模板模板模板、整数值等...
【问题讨论】:
-
这样的东西比简单地写出模板有什么好处?无论如何,这都是静态/编译时间。
-
作文。查看我刚刚编写的这个用例,这是我在编写一些代码时遇到的。 Example pastie。 (tl;博士:
Rename<Map<Wrapper, TList>, Bind<AllTrue, TPredicate>>)
标签: c++ templates metaprogramming c++14 template-templates