重载函数调用编译时常量
Overloading function calls for compile-time constants
我很想知道是否可以区分使用编译时常量提供的参数和不使用的参数的函数调用?
例如:
int a = 2;
foo( a ) // #1: Compute at run-time
foo( 3 ) // #2: Compute at compile-time
有没有办法提供区分这两种情况的重载?或者更一般地说,如何检测文本类型的使用情况?
我已经研究了 constexpr,但函数参数不能是 constexpr。使用相同的调用语法会很好,但能够根据参数是否是文字类型生成不同的代码。
您无法区分编译时文字int
和运行时变量int
。如果需要执行此操作,可以提供只能在编译时工作的重载:
void foo(int ); // run-time
template <int I>
void foo(std::integral_constant<int, I> ); // compile-time
我认为
上面的答案不知何故错过了问题试图表达的观点。
有没有办法提供区分这两种情况的重载?或者更一般地说,如何检测文本类型的使用情况?
这就是"右值引用"的用途。 文本类型是右值。
使用相同的调用语法会很好,但能够根据参数是否是文字类型生成不同的代码。
你可以简单地重载你的 foo() 函数,如下所示:
void foo(int&& a);
因此,当您使用文字调用函数时,例如 foo(3),编译器知道您需要上述重载,因为 3 是一个右值。如果将该函数调用为 foo(a),编译器将选取您的原始版本foo(const int& a);
因为int a=2;
是一个左值。
这为您提供了相同的调用语法。
在一般情况下,你无法在编译时计算 foo(3)。 如果 foo(x) 被定义为在当前日期中添加 x 天 - 并且您下周二首次运行该程序,该怎么办? 如果它确实是一个常量,则使用符号常量。 如果它是一个简单的函数,你可以尝试一个定义(它将在编译时被替换为实现 - 但它仍然会在运行时被评估)
例如
#define MIN(x,y) ((x)<(y)?(x):(y))
相关文章:
- C++常量数组的编译时间较长
- 在编译时将常量字符* 转换为常量 char_type*
- 将编译时常量向量转换为堆分配版本
- 如何在常量计算表达式中获取编译时错误?
- 如何在编译时解析静态常量 std::string?
- 有没有办法在类实例中存储编译时常量?
- 检测编译时文本和常量
- ARM C++编译器不会编译具有可变常量成员的结构
- 强制在编译时计算类的类的常量成员
- Constexpr 类采用常量引用不编译
- 为什么对数组的常量左值引用不编译在下面?
- 由于缺少常量而出现编译错误
- 为什么在将常量 ptr 分配给常量引用时没有收到编译错误?
- 为什么可以在编译时访问非常量、非静态成员而无需类的实例
- 不是 VS2017 中的编译时常量表达式
- 将编译时定义大小的数组初始化为常量表达式
- 将大小为编译时常量的数组初始化为单个值
- 如何为 std::array 声明全局编译时常量?
- 返回非常量引用编译的 Const 方法
- 常量正确性编译错误到模板函数中的无效转换错误