Я пытаюсь специализировать некоторый код полезности для функций-членов const, но у вас есть проблемы, чтобы получить простой тестовый сценарий для работы.
Для упрощения работы я использующая Boost.FunctionTypes и его components<FunctionType>
шаблона - это последовательность MPL который должен contain
тега const_qualified
для константных функций членов.специализация на указатели функции const member
Но, используя нижеприведенный тестовый код, специализация по функциям члена-члена не выполняется. Кто-нибудь знает, как заставить его работать?
тест-код печатает (с использованием VC8 и повышают 1.40):
неконстантная
неконстантная
Ожидаемый результат:
не- 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"
}
В то время как я нашел альтернативный подход, я бы до сих пор с удовольствием принять испытанное решение оригинальная проблема. –