4

いくつかのユーティリティ コードを const メンバー関数に特化しようとしていますが、単純なテスト ケースを機能させるには問題があります。
作業を簡素化するために、Boost.FunctionTypesとそのcomponents<FunctionType>テンプレート ( const メンバー関数のタグとなるMPL シーケンス) を利用しています。containconst_qualified

しかし、以下のテスト コードを使用すると、const メンバー関数の特殊化は失敗します。誰かがそれを機能させる方法を知っていますか?

テストコードが出力されます (VC8 とブースト 1.40 を使用):

非定数
非定数

予想される出力は次のとおりです。

非定数
定数

テストコード自体:

#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <boost/function_types/function_type.hpp>
#include <boost/mpl/contains.hpp>

namespace ft  = boost::function_types;
namespace mpl = boost::mpl;

template<typename F>
struct select 
{    
    template<bool IsConst /* =false */>
    struct helper {
        static void f() { std::cout << "non-const" << std::endl; }  
    };

    template<>
    struct helper</* IsConst= */ true> {
        static void f() { std::cout << "const" << std::endl; }  
    };

    typedef ft::components<F> components;
    typedef typename mpl::contains<components, ft::const_qualified>::type const_qualified;
    typedef helper<const_qualified::value> result;
};

typedef boost::function<void (void)> Functor;

template<typename MF>
Functor f(MF f)
{
    return boost::bind(&select<MF>::result::f);
}

class C 
{
public:
    void f1() {}
    void f2() const {}
};

int main()
{
    f(&C::f1)(); // prints "non-const" as expected
    f(&C::f2)(); // prints "non-const", expected "const"
}
4

2 に答える 2

1

via のアプローチが機能しない理由はまだ不明ですが、Boost.FunctionTypesを使用して const メンバー関数に特化し たより簡単function_types::components<>なアプローチがあることに気付きました。
is_member_function_pointer<>

template<typename F>
struct select 
{    
    /* ... helper-struct as before */

    typedef ft::is_member_function_pointer<F, ft::const_qualified> const_qualified;
    typedef helper<const_qualified::value> result;
};
于 2009-12-13T08:05:28.540 に答える
0

私はそれをテストしていませんが、すべきではありません

typedef mpl::contains<components, ft::const_qualified> const_qualified;

なれ

typedef typename mpl::contains<components::type, ft::const_qualified>::type const_qualified;
于 2009-12-13T07:31:31.033 に答える