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<<',';} 
    }
};

エラーメッセージは次のとおりです。

エラー: 'template struct boost::is_same' のテンプレート パラメーター リストの引数 1 で型/値が一致しません

エラー: タイプが必要ですが、'boost::mpl::tag::type' を取得しました

4

2 に答える 2

1

残念ながら、コンパイル時プログラミングと実行時プログラミングの概念が混在しています。

テンプレート メタプログラミングの世界では、enable_if ( http://en.cppreference.com/w/cpp/types/enable_if ) のようなものを使用して、目的を達成します。

そのページには、コンパイル時の型に基づいて、実行時に実行する実装を選択する方法を示す多数の例があります。

また、MPL に関する Dave Abraham の本 ( http://www.amazon.com/Template-Metaprogramming-Concepts-Techniques-Beyond/dp/0321227255 ) を読むことをお勧めします。

MPL を理解すると、高度に最適化されたプログラムを開発できるようになります。

于 2013-10-11T23:55:39.573 に答える