boost::mpl::apply 仅适用于类型化模板参数
Posted
技术标签:
【中文标题】boost::mpl::apply 仅适用于类型化模板参数【英文标题】:boost::mpl::apply only works with typed template args 【发布时间】:2013-10-17 19:07:09 【问题描述】:boost::mpl::apply
元函数仅适用于模板 type 参数。例如,以下工作:
using namespace boost::mpl;
template <class U, class S = int>
struct Bar ;
using BarInt = apply<Bar<_1>, int>::type;
但是,如果我有一个带有非类型参数的单独类模板:
template <class U, int S = 50>
struct Quux ;
using QuuxInt = apply<Quux<_1>, int>::type;
我收到如下编译错误:
/usr/include/boost/mpl/aux_/preprocessed/gcc/apply_wrap.hpp:36:8: error: no class template named ‘apply’ in ‘struct Quux<mpl_::arg<1> >’
struct apply_wrap1
^
foo.cxx: In function ‘int main()’:
foo.cxx:25:21: error: expected type-specifier
using QuuxInt = apply<Quux<_1>, int>::type;
^
除了为 Bar 创建一个将所有非类型参数变成类型参数的子类型之外,还有其他方法吗?
【问题讨论】:
【参考方案1】:不,没有办法。您必须编写一个包装器。值得庆幸的是,如果你让你的包装器成为一个元函数,它接受类型参数并解包为预期的非类型参数:
template <class U, class S = std::integral_constant<int, 50>>
struct QuuxWrap
using type = Quux<U, S::value>;
;
然后只需在QuuxWrap
上申请即可获得您想要的:
using QuuxInt = apply<QuuxWrap<_1>, int>::type;
// QuuxInt is Quux<int, 50>
值是模板元编程的红发继子。如果您将所有值提升为类型,那么一切都会变得更容易处理。
【讨论】:
以上是关于boost::mpl::apply 仅适用于类型化模板参数的主要内容,如果未能解决你的问题,请参考以下文章
C++ switch 仅适用于整数类型的基本原理是啥? [复制]
使用迭代器成员函数“empty()”是不是仅适用于某些向量类型?
Google Places Autocomplete API“类型”参数仅适用于建立?