C++标准函数指针数组的语法

4
我想要一个函数指针的std::array。我能找到的唯一类似的例子是旧式的原始数组,或者是std::function的std::array。
这种语法是否可行?
bool (*arr[2])(int) = { foo, foo2 };

声明一个包含2个函数的数组,接受一个整数参数并返回一个 `bool`...
...如何使用 `std::array`?

在C++中,确实不要使用函数指针,而是使用std::function,你的语法将会是std::array<std::function<bool(int)>,2ul>。这样做还可以让你使用lambda表达式/函数作为参数。(函数指针也可以工作) - Pepijn Kramer
2
@PepijnKramer 使用std::function()会增加虚函数调用的开销。 - Evg
@Evg 确切地说(虚拟通话)...... - rare77
@Evg 请将答案翻译成中文,我会接受。 - rare77
@Evg 没错,我认为这是一种工程上的权衡。:) (是的,我知道我写的大部分内容并不完全受时间/空间限制) - Pepijn Kramer
std::array<bool(*)(int), 2> 这种形式不易阅读。更易读的方式是使用类型别名(可以是 using Func = bool(*)(int) 或者 typedef bool (*Func)(int)),然后使用 std::array<Func, 2> - Peter
3个回答

8
根据{{link1:“顺时针/螺旋规则”}},bool (*)(int)是一个指向接受int并返回bool的函数的指针,因此:
std::array<bool (*)(int), 2> arr = { /* ... */ };

或者使用类型别名:

using FunPtr = bool (*)(int);
std::array<FunPtr, 2> arr = { /* ... */ };

我会把类型别名放在前面;另一个版本更难阅读。+1。 - Pete Becker
我会先放置类型别名;另一个版本更难阅读。+1。 - undefined

3
使用和,你甚至不需要太关心类型。
#include <iostream>
#include <array>

int foo(int f)
{
    return f*f;
}

int bar(int b)
{
    return b*b*b;
}

int main()
{
    std::array arr = {&foo, &bar};
    std::cout << arr[0](6);
    std::cout << arr[1](3);

    return 0;
}

https://godbolt.org/z/7qnY4s781


1
#include <array>

// Declare function type
using MyFunctionType = bool(*)(int);

// Sample functions
bool function1(int i) {
    // Function 1 implementation
}

bool function2(int i) {
    // Function 2 implementation
}

void function3() {
    // Function 3 implementation
}

int main() {
    // Declare array of function pointers
    std::array<MyFunctionType, 3> functionArray;

    // Assign functions to array elements
    functionArray[0] = &function1;
    functionArray[1] = &function2;
    functionArray[2] = &function3;

    // Call functions through array
    functionArray[0](1);
    functionArray[1](2);
    functionArray[2](3);

    return 0;
}

std::array<MyFunctionType, 3> function Array = { &function1, &function, &function }; 应该也可以工作。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接