C ++不允许定义函数类型数组的基本原理(技术或概念)是什么? E.g。
\\n
答案 0 :(得分:5)
我给出了两个随机函数:
int a( int x, int y )
{
return x * y;
}
int b( int x, int y )
{
int result = 0;
for (int xi = 1; xi <= x; xi++)
for (int yi = y; yi > 0; yi--)
result += xi * xi;
return result;
}
你怎么建议我把它们放在一个数组中?
我可以编译它们,我想,然后只有一个max(sizeof(a的字节码),sizeof(b的字节码))数组。但现在我还有一些额外的考虑因素:
这个阵列在哪里?
某些处理器可以从内存中的任何位置运行代码有些人不能。
代码的安全属性怎么样?
搬迁注意事项怎么样?
如何调用此功能?
我可以使用处理器的常用调用约定吗?
或者这需要额外的幕后魔术吗?
当我想要一个指向数组的指针时会发生什么? 如果我移动数组然后调用指针会发生什么?
异常和其他异常信号考虑怎么办?
这只是冰山一角。做这种事情有很多的技术考虑因素。
这引出了主要考虑因素:
这会给函数指针带来什么好处?
使用指向函数的指针,我可以做我想做的所有事情:
int (*fs)(int,int)[] = { a, b };
int x = fs[0]( 10, 10 );
int y = fs[1]( 10, 10 );
该语言设计有多个目标 - 最重要的两个目标是简单和灵活性。
做什么会降低每个人的简单性和灵活性:编译器编写者,编译器本身,运行时管理,速度,安全性等。
编辑: tl; dr 因为它没有优于指针或对函数的引用,但有很多缺点。
答案 1 :(得分:-2)
C ++不允许定义函数类型数组的基本原理(技术或概念)是什么?
什么是功能?它只是地址上的一些代码。从概念上讲,它是一个单例,因为没有合理的方法来复制一个或在堆上分配一个。你为什么这样?它已经存在。它有一个名称,该名称产生一个函数指针 - 代码的地址。
有一个&#39;功能对象的概念,它更像是一流的功能&#39;高级语言,如python或javascript。
但在引擎盖下,它被建模为包含代码地址(函数指针)和某些状态的结构。
有几种方法可以创建一个函数数组:(此代码是c ++ 14)
#include <functional>
#include <iostream>
int a(int i) {
std::cout << "called a with " << i << std::endl;
return i;
}
int b(int i) {
std::cout << "called b with " << i << std::endl;
return i + 1;
}
int c(int i) {
std::cout << "called c with " << i << std::endl;
return i + 2;
}
int main()
{
// make life easier by creating a typedef
using raw_fptr = int (*)(int);
// an array of function pointers
raw_fptr raw_ptrs[] =
{
a, b, c
};
// a typedef of a std::function object
using fobject = std::function<int(int)>;
// an array of function objects
fobject fobjects [] = {
&a, // can capture a function pointer
[](int i) -> int { // or a lambda
return b(i);
},
std::bind(&c, std::placeholders::_1) // or a binder
};
for (auto&& f : raw_ptrs)
f(0);
for (auto&& f : fobjects)
f(1);
}