使用 boost::mpl,我如何获得有多少模板类不是“空”,并用这个数字调用一些宏?
我想根据 boost::mpl::eval_if (或类似函数)的结果来调用带有一些参数的宏,这些参数可以给出有多少个模板参数不为空。假设我们有一些如下所示的伪代码:
struct EmptyType { };
template<class arg1=EmptyType, class arg2=EmptyType, class arg3=EmptyType>
class my_class
{
eval_if<is_not_same<arg1, EmptyType>, FILL_MY_CLASS_DEFINE(1)> else
eval_if<is_not_same<arg2, EmptyType>, FILL_MY_CLASS_DEFINE(2)> else
eval_if<is_not_same<arg3, EmptyType>, FILL_MY_CLASS_DEFINE(3)>;
};
我试图根据 EmptyType
参数的数量来填充我的类。我想知道如何通过 Boost.MPL/Preprocessor 或其他 Boost 库在 C++03 中完成这样的事情?
I want to call a macro with some arguments depending on the result of boost::mpl::eval_if
(or a similar function) that could give how many template arguments are not empty. Say we have some pseudocode like the following:
struct EmptyType { };
template<class arg1=EmptyType, class arg2=EmptyType, class arg3=EmptyType>
class my_class
{
eval_if<is_not_same<arg1, EmptyType>, FILL_MY_CLASS_DEFINE(1)> else
eval_if<is_not_same<arg2, EmptyType>, FILL_MY_CLASS_DEFINE(2)> else
eval_if<is_not_same<arg3, EmptyType>, FILL_MY_CLASS_DEFINE(3)>;
};
I am trying to fill my class with some content depending on how many arguments are EmptyType
. I wonder how such thing can be done in C++03 via Boost.MPL/Preprocessor or some other Boost library?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您不需要预处理器或 mpl。您需要部分专业化:
编辑这适用于 C++03,实时查看:https:// /ideone.com/6MaHJ
You don't need preprocessor or mpl. Partial specialization is you need:
Edit This works in C++03, see it live: https://ideone.com/6MaHJ
您在寻找可变参数模板吗?
输出:
Are you looking for variadic templates?
Output:
当您有许多模板参数时,部分特化可能不切实际并且容易出错。
下面的代码将执行您想要的操作,但正如其他答案中已经提到的那样,它并不总是最好的继续方式。
When you have many template arguments, a partial specialization can be impractical and error-prone.
The code below will do what you want, but as it was already mentioned in other answers, it's not always the best way to proceed.