Boost.MPL

型からテンプレート引数を取り出す

mpl::applyは、typeという名前の内部型を持っているかどうか調べるために、結果の型をインスタンス化してしまう(らしい) それによって不正な型が出来上がる場合がある インスタンス化されてもいいようなテンプレートを代役に立ててmpl::applyしたあと、元の…

Placeholder Expressionの罠

型がMetafunctionであるかないかでapplyの動作が変わる PlaceholderExpression自体がill-formedになり得る 型でないパラメータを取る場合機能しない デフォルトでは、template parameterの数が5個より多いと動作しない boost::tupleなんかは駄目である GCC3…

object generator再び

前回([id:mb2sync:20061210])のはマクロになってしまったが、マクロなしでもできた (実装) []#include[] []<utility>[] []#include[] []<pstade/object_generator.hpp>[]</pstade/object_generator.hpp></utility>

Loki(Modern C++ Design)とBoost.MPLの対応のまとめ

おそらくアロケータ関連のもの以外の全てをboostは持っている Int2Type: boost::mpl::int_ Type2Type: boost::type Select: boost::mpl::if_ TypeTraits: Boost.TypeTraitsとBoost.CallTraits Big, Small: yes_type, no_typeなど 実装の詳細 NullType: boost…

Boost.MPLでWTLのマクロの削除を試みる

ソースはこちら デバッグ時には、「全般→デバッグ情報の形式→行番号のみ(/Zd)、または無効」を選択しないとコンパイラがクラッシュすることがある 使用法は以下のような感じになる(この例でプログラムサイズはマクロより2KBほど大きくなる) []struct[] []big…

Loki.StaticDispatcherをBoost.MPLで書ける

boost::python::type_infoはLoki::TypeInfoに相当する(ここでは使わない) []// multimethods.cpp : コンソール アプリケーションのエントリ ポイントを定義します。[] []//[][]#include[][] "stdafx.h"[][]#include[][] <boost/mpl/reverse_fold.hpp>[] []#include[][] <boost/mpl/vector.hpp>[] []#include[][] <boost/mpl/sort.hpp></boost/mpl/sort.hpp></boost/mpl/vector.hpp></boost/mpl/reverse_fold.hpp>…

Loki::AbstractFactoryをBoost.MPLで書く

[]// abstract_factory.cpp : コンソール アプリケーションのエントリ ポイントを定義します。[] []//[][]#include[][] "stdafx.h"[][]#include[][] <boost/mpl/identity.hpp>[] []#include[][] <boost/mpl/inherit.hpp>[] []#include[][] <boost/mpl/inherit_linearly.hpp>[] []#include[][] <boost/mpl/bind.hpp>[]</boost/mpl/bind.hpp></boost/mpl/inherit_linearly.hpp></boost/mpl/inherit.hpp></boost/mpl/identity.hpp>

boost::mpl::inherit_linearlyとLoki::Gen***Hierarchyの関係

Modern C++ Design Section 3.13をboost::mplで書ける mpl::inherit_"linearly"は同書の"LinearHierarchy"を示しているのではないことに注意 #include <[]boost[]/mpl/inherit.hpp> #include <[]boost[]/mpl/inherit_linearly.hpp> #include <[]boost[]/mpl/…

boost::mpl::Assertsの実装の概要

#include <[]boost[]/mpl/bool.hpp> #include <[]boost[]/mpl/eval_if.hpp>namespace question { struct X { int a; }; int X::* what_is_this(); int X::** what_is_that(); inline void test_X() { X x; // pointer to member a int X::*p2a = &X::a; x.*p…

boost::mpl::identityとboost::type

#include <iostream> #include <[]boost[]/mpl/identity.hpp> #include <boost/mpl/for_each.hpp> #include <boost/mpl/vector.hpp> #include <boost/type.hpp>namespace pst { namespace mpl = boost::mpl; struct my_print_type { // mpl-style template <typename T> void operator()(mpl::identity<T>) const { std::co…</t></typename></boost/type.hpp></boost/mpl/vector.hpp></boost/mpl/for_each.hpp></iostream>

Boost.MPLの概念

Metafunction Metafunction Class Lambda Expression Placeholder Expression

Metafunction Forwarding

// struct mf1 : mf2 { }; は // Metafunctionが等しいこと(mf1 = mf2) template <typename T_tiny> struct tiny_at<T_tiny, 0> : mpl::identity<typename T_tiny::t0> { // typedef T_tiny::t0 type; };</typename></t_tiny,></typename>

boost::mpl::placeholderの概観

#include <boost/mpl/int.hpp> #include <boost/mpl/plus.hpp> #include <boost/mpl/apply.hpp> #include <boost/mpl/assert.hpp> using namespace boost::mpl; // STEP0 BOOST_MPL_ASSERT_RELATION( ( apply< plus<_1,_2>, int_<6>, int_<7> >::type::value), ==, 13 ); // STEP0': synonym // 実際はint_<0>ではなくintegral_c</_1,_2></boost/mpl/assert.hpp></boost/mpl/apply.hpp></boost/mpl/plus.hpp></boost/mpl/int.hpp>

mpl::eval_if_cの実装

template<bool C, typename F1, typename F2> struct eval_if_c :/*=*/ if_c<C,F1,F2>::type { };</c,f1,f2></bool>