Специализирую шаблон на лямбде в 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<????> { ... }
что позволит этому классу признаков принять лямбда-выражение?