C++ 模板是否可以专门用于常规模板之类的基本类型?
我已经编写了以下代码来中缀模板类:C++ 模板是否可以专门用于常规模板之类的基本类型?,c++,c++11,template-meta-programming,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<
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 {};
}
模板
结构中缀
{
C型;
};
模板
constexpr中缀运算符(中缀,B)
{
返回{};
}
这允许我编写
ab
,其中与具有类型infix\u t
。但是,如果a
或b
的类型是基本类型,则我得到模板参数具有不同的模板参数…
;如果我尝试重新声明infix\u t
以接受基本类型,我会得到模板参数。。。必须是类模板或别名模板
。我认为模板而不是类型名可以接受基本原理。这是因为它是一个模板,并且规则不同,还是我只是走错路了?要让您的代码编译,很容易:
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 {}; }
现在,bob
是一个只接受类型的积分常量。它期望第二个类型编码常量的值,第一个类型编码类型
这就是海龟,因为U
本身可能是一个积分常数
无法获取值7
并从表达式生成积分常量。您可以使用令牌7_常量
并生成std::integral_常量
,但这是一个不同的问题。要通过@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{}) );
}
#包括
模板
结构中缀{};
模板
constexpr中缀运算符(中缀,R)
{返回{};}
constexpr auto same_as=infix{};
模板
constexpr auto int_c=std::integral_constant::value;
int main()
{
静态断言(int_c int_c);
静态_断言(!(int{}char{}));
}
你能举一个例子,说明调用代码时会出现这个错误吗?这种奇怪的语法有什么意义?它实际上不需要调用来产生这个错误-错误发生在我尝试专门化模板时。然而,我的预期用途是auto infixed=infix\u t
,其中other
是一个类型名上的模板和一个基本值,例如std::integral\u常量;我在一篇名为“句法阿斯巴甜”(暗指句法糖)的文章中读到了这种风格。嗯,我认为OP希望能够说int
(或Boost.Hana style0\u c 0\u c
),而不是0
。我看不出有办法做到前者。此外,如果没有嵌套类型,则可能只使用infix
而不是infix\u t
@temp-sure。他们可以tag
tho。
#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{}) );
}