我最近尝试过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>
//使用元函数标签&lt;&gt;获取类型,以便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<<',';}
}
};
以下是错误消息:
错误:模板参数列表中参数1的类型/值不匹配'template struct boost :: is_same'
错误:期待一个类型,得到'boost :: mpl :: tag :: type'
答案 0 :(得分:2)
答案 1 :(得分: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后,您将能够开发高度优化的程序。