模板模板可以专用于常规模板之类的基本类型吗?
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>
。但是,如果 a
或 b
的类型是基本类型,我会得到 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 {}; }
如果你想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{}) );
}
我编写了以下代码来中缀模板化 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>
。但是,如果 a
或 b
的类型是基本类型,我会得到 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 {}; }
如果你想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{}) );
}