Я уверен, что видел это ранее, но не могу, чтобы жизнь меня нашла сейчас.Как я могу использовать специализированную специализацию для поиска типов аргументов функции-члена и т. Д.?
Учитывая класс с функцией члена той или иной форме, например:
int Foo::Bar(char, double)
Как я могу использовать шаблон и различные специализации вывести составные типы, например:
template<typename Sig>
struct Types;
// specialisation for member function with 1 arg
template<typename RetType, typename ClassType, etc...>
struct Types<RetType (ClassType::*MemFunc)(Arg0)>
{
typedef RetType return_type;
typedef ClassType class_type;
typedef MemFunc mem_func;
typedef Arg0 argument_0;
etc...
};
// specialisation for member function with 2 args
template<typename RetType, typename ClassType, etc...>
struct Types<RetType (ClassType::*MemFunc)(Arg0, Arg1)>
{
typedef RetType return_type;
typedef ClassType class_type;
typedef MemFunc mem_func;
typedef Arg0 argument_0;
typedef Arg0 argument_1;
etc...
};
Такое, что когда я создаю типы с помощью моей функции-члена, например:
Types<&Foo::Bar>
оно разрешает правильная специализация, и объявите соответствующие typedefs?
Edit:
Я играл с фаст-делегатов с обратного вызова статически связанного с функцией члена.
У меня есть следующий макет, который я считаю, это статический привязать к функции члена:
#include <iostream>
template<class class_t, void (class_t::*mem_func_t)()>
struct cb
{
cb(class_t *obj_)
: _obj(obj_)
{ }
void operator()()
{
(_obj->*mem_func_t)();
}
class_t *_obj;
};
struct app
{
void cb()
{
std::cout << "hello world\n";
}
};
int main()
{
typedef cb < app, &app::cb > app_cb;
app* foo = new app;
app_cb f (foo);
f();
}
Однако - как это получить как специализацию в описанном выше порядке?
, к сожалению, вся суть этого упражнения заключается в том, что я хочу, чтобы статически привязать к функции члена, так что оптимизатор может так оптимизировать через границу указателя функции. Будет ли использовать decltype для этого? –
'decltype' возвращает тип объекта, а не сам указатель. Вы пытаетесь сделать [быстрый делегат] (http://www.codeproject.com/KB/cpp/ImpossiblyFastCppDelegate.aspx)? – kennytm
Я действительно - см. Редактирование вопроса. благодаря –