boost :: mpl :: apply仅适用于类型化模板args

时间:2013-10-17 19:07:10

标签: c++ boost boost-mpl

boost::mpl::apply元函数仅适用于模板类型参数。例如,以下工作:

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 个答案:

答案 0 :(得分: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>

值是模板元编程的红头发儿童。如果将所有值提升到类型,一切都变得更容易处理。