我希望使用相同的参数创建许多函数,例如:
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); }
但是,我不喜欢使用宏。有没有更安全的方法呢?
答案 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;
}
答案 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);
}
这也处理a
和b
类型不同,或者a + b
与a
或b
的类型不同的情况
答案 3 :(得分:1)
如果这些是成员函数,您可以声明它们的公共类型(typedef const int Fn(int, int)
),使用该类型声明类中的成员函数:
Fn add, subtract;
然后以正常方式在课外定义它们。不保存样板文件,但至少意味着如果你在定义中输入拼写错误就不会编译。
或者对于非成员函数,请参阅我链接的问题,其中有一些聪明的方法来定义函数指针而不是函数。