4

Я пытаюсь специализировать некоторый код полезности для функций-членов 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" 
} 
+0

В то время как я нашел альтернативный подход, я бы до сих пор с удовольствием принять испытанное решение оригинальная проблема. –

ответ

1

Хотя его до сих пор не ясно мне, почему подход через function_types::components<> не работает, я понял, что есть более простой подход с Boost.FunctionTypes to sp ecialize на константных функциях членов:
Классификационной меты функции, такая как 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; 
}; 
0

Я не проверял, но не

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

должен быть

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

Уже пробовал, не имеет значения. –

+0

Я видел ваше редактирование там, но ваши компоненты typedef также нуждаются в типе или вроде того, что я делал в сообщении. – leiz

+0

:: type - это вызов функции meta и получение результата. Если вы этого не сделаете, он использует мета-функцию. – leiz

Смежные вопросы