我编写了以下代码来修改模板化的类:
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
。我认为类型名称上的模板无论如何都可以接受基本面。这是因为它是一个模板模板,规则是不同的,还是我只是接近这个错误?
答案 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 {}; }
如果你想采用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>
,但这是一个不同的问题。
答案 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{}) );
}