复制功能签名

时间:2014-07-05 06:10:29

标签: c++

我希望使用相同的参数创建许多函数,例如:

const int add(const int a, const int b) {
    return (a + b);
}
decltype(add) subtract {
    return (a - b);
}
/* many more functions */

目的是我能够轻松更改参数类型一次以更改所有功能。我知道宏可以这样做:

#define INT_OPERATION(name) const int name (const int a, const int b)
INT_OPERATION(add) { return (a + b); }
INT_OPERATION(subtract) {return (a - b); }

但是,我不喜欢使用宏。有没有更安全的方法呢?

4 个答案:

答案 0 :(得分:3)

功能签名不能typedef。只有一个函数的类型。所以说:

是有效的
typedef int INT_OPERATION(int a, int b);

然后转发声明具有此类型的函数:

INT_OPERATION Add;

当涉及定义您必须指定参数的函数时,所以后面的无效

INT_OPERATION Add { /* No can do */ }

(只要在()之后放置一组Add,你就会声明一个函数返回一个无效的普通函数C ++)

关于泛型类型

使用通用编程工具时,相同的过程也有类似的限制。您可以声明以下typedef:

template<typename T>
using INT_OPERATION = const T(T const, T const);

然后将其用于函数(转发)声明

INT_OPERATION<int> add;

int main() {
    std::cout << add(1, 2) << std::endl;
    return 0;
}

但是在定义它时,你必须是mandane

const int add(int const a, int const b) {
    return a + b;
}

Demo

答案 1 :(得分:2)

也许是这样的:

#include <iostream>
#include <functional>

typedef std::function<int(int, int)> IntFunction;

IntFunction add = [](int a, int b) {return a + b;};
IntFunction substract = [](int a, int b) {return a - b;};

int main(int, char**) {
    std::cout << add(1, 2) << std::endl;
    std::cout << substract(1, 2) << std::endl;
    return 0;
}

仍然是样板代码,但值得一试;)

答案 2 :(得分:1)

如果您的主要关注点是能够轻松更改参数类型&#34;,则可以直接将其作为模板编写,这样您就不必更改参数类型:

template <typename T1, typename T2>
auto add (const T1 &a, const T2 &b) -> decltype(a + b) {
    return (a + b);
}

这也处理ab类型不同,或者a + bab的类型不同的情况

答案 3 :(得分:1)

如果这些是成员函数,您可以声明它们的公共类型(typedef const int Fn(int, int)),使用该类型声明类中的成员函数:

Fn add, subtract;

然后以正常方式在课外定义它们。不保存样板文件,但至少意味着如果你在定义中输入拼写错误就不会编译。

或者对于非成员函数,请参阅我链接的问题,其中有一些聪明的方法来定义函数指针而不是函数。