我有一个模板结构,它将方法的类型和指向方法的指针作为参数,并将其包装在类似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)...);
}
};
代理结构符合预期的简单方案,例如:
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没有报告任何错误,一切都按预期工作。
我的问题是:
答案 0 :(得分:1)
您的宏生成标准不合规代码。特别是,非类型方法指针模板参数中的强制转换不允许。在这种情况下,它也是多余的。
所以解决这个问题的最简单方法是更改宏:
#define WORKING_LUA_METHOD_FLAGS(name_, methodType_, methodPtr_, flags_) \
ANKI_LUA_FUNCTION_AS_METHOD_FLAGS(name_, \
(&proxy<methodType_, methodPtr_>::func), flags_)
在使用时:
ANKI_LUA_METHOD_FLAGS( "bob", (int(Foo::*)(int))(&Foo::foo), empty_flags )
变为:
WORKING_LUA_METHOD_FLAGS( "bob", int(Foo:::*)(int), &Foo::foo, empty_flags )
现在根据标准是正确的。注意"bob"
和empty_flags
只是实际存在的占位符。替换名称可能需要也可能不需要。