模板模板可以专用于常规模板之类的基本类型吗?

Can a template template be specialized for fundamental types like regular templates?

我编写了以下代码来中缀模板化 class:

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。我认为基于类型名的模板无论如何都可以接受基本原理。这是因为它是一个模板模板,规则不同,还是我只是接近错误?

要使您的代码编译通过,非常简单:

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{}>;

现在 bob 是一个只接受类型的 integral_constant。它期望第二种类型对常量的值进行编码,第一种是类型。

这一直是海龟,因为 U 本身可能是一个整数常数。

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

为了扩展和修改@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