LINUX.ORG.RU

можно приэтом можно нарватся и на ub

anonymous
()

Если речь и получении типа, то в Boost есть Function Types для декомпозиции и синтеза типов функций, а в C++11 можно использовать variadic templates.

Begemoth ★★★★★
()
Последнее исправление: Begemoth (всего исправлений: 1)
Ответ на: комментарий от Begemoth

Буста - нету. Variadic templates можно использовать для вытаскивания типов аргументов из объявления? Каким образом

vova7890 ★★★
() автор топика
template<typename T, typename R, typename... A>
struct S {
    typedef R (T::*type)(A...);
};

template<typename T, typename R, typename...A>
S<T, R, A...> make_s(T &, R (*)(A...)) {
    return S<T, R, A...>();
}

template<typename T, typename M>
struct U {
    T &t;
    M &m;
    typedef typename decltype(make_s(t, m))::type type;
};

#include <iostream>

using namespace std;

struct Z {
    void f(int x) {
        cout << x << endl;
    }
};

int main() {
    U<Z, void(int)>::type m = &Z::f;
    (Z().*m)(4);
}
const86 ★★★★★
()
Последнее исправление: const86 (всего исправлений: 1)
Ответ на: комментарий от vova7890

Variadic templates можно использовать для вытаскивания типов аргументов из объявления? Каким образом

Так же как и обычные аргументы шаблона - в частичных специализациях шаблона:

template<typename C, typename F> struct MakeMemberPointer;

template<typename C, typename R, typename... Args>
struct MakeMemberPointer<C, R(Args...)>
{
  typedef R (C::*type) (Args...);
};

// Пример использования:

#include <iostream>
#include <typeinfo>
struct S { };

int main()
{
  std::cout << typeid(MakeMemberPointer<S, void(int)>::type).name() << std::endl;
}

/*
> g++ -o foo -std=c++11 foo.cc
> ./foo | c++filt -t          
void (S::*)(int)
*/
Begemoth ★★★★★
()
Последнее исправление: Begemoth (всего исправлений: 1)
Ответ на: комментарий от Begemoth

в частичных специализациях шаблона

Точно, так даже прикольнее.

const86 ★★★★★
()
Ответ на: комментарий от Begemoth

Блин, я нуб. Надо почитать хоть про эти вариадик темплейтс.

nanoolinux ★★★★
()
Ответ на: комментарий от Begemoth

Я не про это вообще. Имел ввиду что если есть __цельная__ декларация ака:

void (LolClass::*MegaFunc)(int a1, int a2);

И прямо из неё достать аргументы. Так то их таскать и брать через вариадики то понятно... Только похоже, что вот так взять и достать из объявления тот-же вариадик аргументов нельзя. Вопрос снят, спасибо за ответы.

vova7890 ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.