当我遇到std::function时,我才开始研究c ++模板。我真的很喜欢函数声明作为模板参数,所以我提出了以下想法:
我如何实现一个允许我这样调用它的函数:
(1)
void(*pointer_to_function)(int, int) = get_pointer_to_function<void(int, int)>();
我接受了std :: function的定义,如上面的链接所示,并给了它一个镜头。结果让我写了这篇文章并让我深入了解了如何从函数声明中分离返回类型和参数类型:
(2)
template<typename>
struct function;
template<typename ReturnType, typename... ArgumentTypes>
struct function<ReturnType(ArgumentTypes...)> {};
function<void(int, int)> my_function;
我想我可以写这个并使用模板参数推导来填写类型:
(3)
void(*get_pointer_to_function())(int, int) {
return nullptr;
}
我想出了这个:
(4)
template<typename FunctionType>
FunctionType* get_pointer_to_function();
template<typename ReturnType, typename... ArgumentTypes>
ReturnType(*get_pointer_to_function<ReturnType(ArgumentTypes...)>())(ArgumentTypes...) {
return nullptr;
}
但是编译器对我大吼:
... main.cpp(70):错误C2909:'get_pointer_to_function':函数模板的显式实例化需要返回类型
main.cpp(70):错误C2768:'get_pointer_to_function':非法使用显式模板参数
我刚刚开始使用c ++,现在使用模板,所以我想也许我在声明中犯了一个简单的错误。我让它返回void,因此声明更容易。
(5)
template<typename>
void get_function_pointer();
template<typename ReturnType, typename... ArgumentTypes>
void get_function_pointer<ReturnType(ArgumentTypes...)>() {}
这次编译器只对我大吼一声,第一个错误就消失了。
main.cpp(48):错误C2768:'get_function_pointer':非法使用 显式模板参数
经过一段时间将我的头撞到我的键盘上,浏览interwebz我想出了一些编译和运行的东西:
(6)
template<typename>
struct function_pointer;
template<typename ReturnType, typename... ArgumentTypes>
struct function_pointer<ReturnType(ArgumentTypes...)> {
typedef ReturnType(*type)(ArgumentTypes...);
};
template<typename FunctionType>
typename function_pointer<FunctionType>::type get_function_pointer() {
return nullptr;
}
int main() {
auto pointer_to_function = get_function_pointer<void(int, int)>();
static_assert(std::is_same<decltype(pointer_to_function), void(*)(int, int)>::value, "Not the same");
return 0;
}
但是我觉得我这段代码太复杂了,我希望(4)的代码能够正常工作。
我在这里做错了吗?为什么它是非法的?