2014-10-30 2 views
0

мне нужно код для компиляции на Visual Studio 2013C++ 11 МЕТОДИЧЕСКИЕ шаблон наложения спектров для указателей на функции

Первоначально я имел:

class P 
{ 
    typedef void* (P::*FunctionPtr)(void); 
    typedef void* (*T_ptr)(void*); 

    private:  
     T_ptr getCompatibleFunctionPointer(FunctionPtr funcPtr); 
     T_ptr m_t_ptr; 

    public: 
     [omitting constructors, etc] 
} 

Теперь добавление шаблонов требует ключевого слова с помощью так что я проверено:

typedef void* (*T_ptr)(void*); 

//tried this: 
template<typename objectThread> 
using FunctionPtr = void(P<objectThread>::*)(void); 
//also tried: 
template<typename objectThread> 
using FunctionPtr = void(P< typename objectThread>::*)(void); 
//also tried: 
template<typename objectThread> 
using FunctionPtr = void(P< typename objectThread>*)(void); 

template<typename objectThread> 
class P{ 


private: 

    template<typename objectThread> 
    T_ptr P<objectThread>::getCompatibleFunctionPointer(FunctionPtr funcPtr) {} 
    T_ptr m_t_ptr; 

}; 

Я не могу найти способ добиться того, что мне нужно. Мне нужно сохранить шаблоны и не использовать Boost (на всякий случай).

ответ

1

Вы можете объявить его только в классе с

using FunctionPtr = void(P<objectThread>::*)(); 

и просто использовать его в классе.

Таким образом, ваш код будет просто

template<typename objectThread> 
class P{ 
    using T_ptr = void*(*)(void*); 
    using FunctionPtr = void(P<objectThread>::*)(); 
private: 
    T_ptr getCompatibleFunctionPointer(FunctionPtr funcPtr) {} 
    T_ptr m_t_ptr; 
}; 
0

Я не вижу проблемы. Единственное, что кажется странным, это то, что вы используете P в качестве шаблона класса в своем псевдониме. В фрагменте P не является шаблоном.

Во всяком случае, это то, что я использую для члена-указателей на функции:

template <typename Class, typename Ret, typename ... Args> 
using MemFunPtr = Ret (Class::*)(Args ...); 

Вы можете использовать его как это:

struct A 
{ 
    void fun(int, char) { cout << "whoop\n"; } 
}; 


int main() 
{ 
    MemFunPtr<A, void, int, char> m = &A::fun; 

    A a; 
    (a.*m)(5, 'a'); 
} 
Смежные вопросы