C ++禁用函数数组的基本原理?

时间:2017-09-03 20:39:37

标签: c++ language-lawyer

C ++不允许定义函数类型数组的基本原理(技术或概念)是什么? E.g。

\\n

2 个答案:

答案 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);

}