Специализирую шаблон на лямбде в C ++ 0x

Я написал класс черт, который позволяет мне извлекать информацию об аргументах и ​​типе функции или функционального объекта в C ++ 0x (протестировано с gcc 4.5.0). Общий случай обрабатывает функциональные объекты:

template <typename F>
struct function_traits {
    template <typename R, typename... A>
    struct _internal { };

    template <typename R, typename... A>
    struct _internal<R (F::*)(A...)> {
        // ...
    };

    typedef typename _internal<decltype(&F::operator())>::<<nested types go here>>;
};

Тогда у меня есть специализация для простых функций в глобальном масштабе:

template <typename R, typename... A>
struct function_traits<R (*)(A...)> {
    // ...
};

Это работает нормально, я могу передать функцию в шаблон или объект функции, и она работает правильно:

template <typename F>
void foo(F f) {
    typename function_traits<F>::whatever ...;
}

int f(int x) { ... }
foo(f);

Что если вместо передачи функции или объекта функции вfooХочу передать лямбда-выражение?

foo([](int x) { ... });

Проблема здесь в том, что ни специализацияfunction_traits<> применяется. В проекте C ++ 0x говорится, что тип выражения является «уникальным, безымянным, не объединенным типом класса». Разоблачение результата вызоваtypeid(...).name() в выражении дает мне то, что, по-видимому, является внутренним соглашением именования gcc для лямбды,main::{lambda(int)#1}, а не то, что синтаксически представляет имя типа C ++.

Короче говоря, есть ли что-нибудь, что я могу вставить в шаблон здесь:

template <typename R, typename... A>
struct function_traits<????> { ... }

что позволит этому классу признаков принять лямбда-выражение?

Ответы на вопрос(3)

Ваш ответ на вопрос