У меня есть шаблонная структура, которая принимает в качестве параметров тип метода и указатель на метод и оборачивает его в C-подобную функцию:
template <typename T, T> struct proxy;
template <typename T, typename R, typename ...Args, R (T::* mf)(Args...)>
struct proxy<R (T::*)(Args...), mf>
{
static R call(T& obj, Args&&... args)
{
return (obj.*mf)(std::forward<Args>(args)...);
}
};
Структура proxy работает в простых сценариях, как и ожидалось, например:
struct Foo
{
int foo(int x)
{
return x + 1;
}
};
...
Foo f;
proxy<int(Foo::*)(int), &Foo::foo>::call(f, 10);
Проблема в том, что когда я использую proxy внутри макросов, которые могут разворачиваться в:
proxy<decltype((int(Foo::*)(int))(&Foo::foo)), (int(Foo::*)(int))(&Foo::foo)>::call(f, 10);
в clang и ошибка:
error: non-type template argument is not a pointer to member constant
proxy<decltype((int(Foo::*)(int))(&Foo::foo)), (int(Foo::*)(int))(&Foo::foo)>::call(f, 10);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
С другой стороны, GCC 4.8 не сообщает об ошибках, и все работает так, как ожидалось.
Мои вопросы:
- есть ли способ обойти ошибку clang и
- это ошибка в clang, о которой я, вероятно, должен сообщить?
&
id-expression или просто id-expression для обычных (не являющихся членами) функций. - person dyp   schedule 12.04.2014decltype((int(Foo::*)(int))(&Foo::foo))
Какое-то странное выражение. Если у вас есть тип для преобразования, почему вы используетеdecltype
и приведение типов? Или это из аргумента макроса? - person dyp   schedule 12.04.2014&class_name::member_name
. Это, вероятно, приводит к тому же ограничению: приведение типов не разрешено. - person dyp   schedule 12.04.2014foo
?) - person Oktalist   schedule 12.04.2014