gpt4 book ai didi

c++ - boost::mpl::apply 仅适用于类型化模板参数

转载 作者:太空宇宙 更新时间:2023-11-04 11:47:23 26 4
gpt4 key购买 nike

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 创建一个子类型将所有非类型参数转换为类型参数之外,是否有解决这个问题的方法?

最佳答案

不,没有办法绕过它。你必须写一个包装器。值得庆幸的是,如果你让你的包装器成为一个元函数,它接受类型参数,并解包成预期的非类型参数:

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>

值是模板元编程的红发继子。如果你把所有的值(value)观 boost 到类型上,一切都会变得更容易处理。

关于c++ - boost::mpl::apply 仅适用于类型化模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19435121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com