我有一个模板结构体,它将方法的类型和指向方法的指针作为参数,并将其包装在类似 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)...);
}
};
The proxystruct 按预期在简单场景中工作,例如:
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);
in 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 错误吗?