0

我最近尝试了 boost::mpl ,它看起来既棒又可怕。有时编译错误信息相当混乱。

这次我遇到以下代码的问题:

#include <iostream>
#include <boost/type_traits/is_same.hpp>
#include <boost/mpl/integral_c_tag.hpp>
#include <boost/mpl/tag.hpp>
#include <typeinfo>
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/range_c.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/copy.hpp>

//使用元函数tag<>获取类型,这样mpl只会输出整数。

struct mpl_func2
{
    template<typename T>
    void operator()(T t)
    {
        if(boost::is_same<boost::mpl::tag<T>::type, boost::mpl::integral_c_tag>::value)
        {cout<<t<<',';} 
    }
};

这是错误消息:

错误:“模板结构 boost::is_same”的模板参数列表中的参数 1 的类型/值不匹配

错误:需要一个类型,得到 'boost::mpl::tag::type'

4

2 回答 2

2

你应该使用

typename boost::mpl::tag<T>::type

因为typedependent-name在此处阅读有关它的更多信息

于 2013-05-27T07:40:14.783 回答
1

不幸的是,您混淆了编译时和运行时编程的概念。

在模板元编程世界中,您将使用类似 enable_if ( http://en.cppreference.com/w/cpp/types/enable_if ) 来完成您想要的。

在该页面中,有许多示例将说明如何根据编译时类型选择在运行时执行的实现。

我还建议阅读 Dave Abraham 关于 MPL 的书 ( http://www.amazon.com/Template-Metaprogramming-Concepts-Techniques-Beyond/dp/0321227255 )。

一旦您了解了 MPL,您将能够开发高度优化的程序。

于 2013-10-11T23:55:39.573 回答