Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板是否可以专门用于常规模板之类的基本类型?_C++_C++11_Template Meta Programming - Fatal编程技术网

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 style
0\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{}) );
}