最近在研究 unique_ptr 的实现。其中需要分辨出函数类型和其他类型。 实验发现 MSVC 的编译器似乎无法正确的处理函数调用方式。
template <typename R>
struct is_unary_function_impl<R(__cdecl*)()>
{
static const bool value = true;
};
template <typename R>
struct is_unary_function_impl<R(__cdecl*)(...)>
{
static const bool value = true;
};
bool _cdecl unary_func_1() {
return true;
}
bool _fastcall unary_func_2() {
return true;
}
int main()
{
ASSERT(true == is_unary_function<decltype(&unary_func_1)>::value);
//现在 value == false,它应该为 true。
ASSERT(true == is_unary_function<decltype(&unary_func_2)>::value);
return 0;
}
如果在模板声明后面加上这样的代码:
template <typename R>
struct is_unary_function_impl<R(__stdcall*)()>
{
static const bool value = true;
};
template <typename R>
struct is_unary_function_impl<R(__stdcall*)(...)>
{
static const bool value = true;
};
编译器会给出一个编译错误
error C2953: 'is_unary_function_impl<R(__cdecl *)(void)>': class template has already been defined
我要怎么改才能让编译器能识别_stdcall 的函数?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.