const成员函数指针的专业化

时间:2009-12-13 01:57:32

标签: c++ templates boost specialization member-function-pointers

我试图在const成员函数上专门化一些实用程序代码,但是有一些问题可以让一个简单的测试用例工作。
为了简化工作,我正在使用 Boost.FunctionTypes 及其components<FunctionType>模板 - MPL序列contain标记const_qualified用于const成员函数。

但是使用下面的测试代码,const成员函数的专门化失败了。有人知道如何让它发挥作用吗?

测试代码打印出来(使用VC8和boost 1.40):

  

非const
  非常数

预期输出为:

  

非const
  const

测试代码本身:

#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"
}

2 个答案:

答案 0 :(得分:1)

虽然我仍然不清楚为什么通过function_types::components<>的方法不起作用,但我意识到使用 Boost.FunctionTypes 有一个更简单的方法来专门研究const成员函数:<登记/> 类似于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;
};

答案 1 :(得分:0)

我没有测试过,但不应该

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

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