模板模板可以专门用于常规模板等基本类型吗?

时间:2016-08-30 12:57:14

标签: c++ c++11 template-meta-programming

我编写了以下代码来修改模板化的类:

template<template<typename...> class C, typename A, typename B>
struct infix_t
{
    typedef C<A, B> type;
};

template<template<typename...> class C, class A>
constexpr infix_t<C, A> operator<(A, infix_t<C>)
{
    return {};
}


template<template<typename...> class C, typename A, typename B>
constexpr C<A, B> operator>(infix_t<C, A>, B)
{
    return {};
}

这允许我写a <same_as> b same_as类型为infix_t<std::is_same>。但是,如果ab的类型是基本类型,我会template template argument has different template parameters...;如果我尝试重新声明infix_t接受基本类型,我会template argument ... must be a class template or alias template。我认为类型名称上的模板无论如何都可以接受基本面。这是因为它是一个模板模板,规则是不同的,还是我只是接近这个错误?

2 个答案:

答案 0 :(得分:2)

要编译代码,这很容易:

template<template<class...> class C, class...Z>
struct infix_t {};

template<template<class...> class C, class A>
constexpr infix_t<C, A> operator<(A, infix_t<C>)
{ return {}; }


template<template<class...> class C, class A, class B>
constexpr C<A, B> operator>(infix_t<C, A>, B)
{ return {}; }

live example

如果你想采用std::integral_constant并应用它,你首先要把它包起来:

template<class T, class U>
using bob = std::integral_constant<T, U{}>;

现在bobintegral_constant,只接受类型。它期望第二种类型编码常量的值,第一种类型。

这是乌龟一直向下,因为U本身可能是一个不变的常数。

无法获取值7并从表达式生成整数常量。您可以使用令牌 7_constant并生成std::integral_constant<int, 7>,但这是一个不同的问题。

答案 1 :(得分:0)

要通过@Yakk扩展和修改解决方案,这里有一个允许类型的编译时比较的版本

#include <type_traits>

template<template<class...> class Op, class... Args>
struct infix {};

template<template<class...> class Op, class L>
constexpr infix<Op, L> operator<(L, infix<Op>)
{ return {}; }


template<template<class...> class Op, class L, class R>
constexpr Op<L, R> operator>(infix<Op, L>, R)
{ return {}; }

constexpr auto same_as  = infix<std::is_same>{};

template<int N>
constexpr auto int_c = std::integral_constant<int, N>::value;

int main()
{
    static_assert( int_c<0> <same_as> int_c<0> );
    static_assert( !(int{} <same_as> char{}) );
}

Live Example