C++ 重载函数调用编译时常量

C++ 重载函数调用编译时常量,c++,c++11,C++,C++11,我想知道是否可以区分使用编译时常量提供的参数的函数调用和不使用编译时常量的函数调用 例如: int a = 2; foo( a ) // #1: Compute at run-time foo( 3 ) // #2: Compute at compile-time 有没有办法提供区分这两种情况的重载?或者更一般地说,如何检测文字类型的使用 我已经研究了constexpr,但是函数参数不能是constexpr。使用相同的调用语法会很好,但是能够根据参数是否为文本类型生成不同的代码。您无法区分

我想知道是否可以区分使用编译时常量提供的参数的函数调用和不使用编译时常量的函数调用

例如:

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
void foo(int);//运行时
模板
void foo(标准::积分常数);//编译时

在一般情况下,无法在编译时计算foo(3)。如果foo(x)被定义为将x天添加到当前日期,并且您在下周二首先运行该程序,该怎么办?如果它真的是一个常量,那么使用符号常量。如果它是一个简单的函数,您可以尝试使用define(它将在编译时被实现替换,但仍将在运行时进行计算)

e、 g


#define MIN(x,y)((x)我认为上面的答案在某种程度上忽略了问题试图表达的要点

有没有办法提供区分这两种情况的重载?或者更一般地说,如何检测文字类型的使用

这就是“右值引用”的含义。文字类型是右值

使用相同的调用语法会很好,但是能够根据参数是否为文本类型生成不同的代码

只需将foo()函数重载为:

void foo(int&& a);
因此,当您使用文本(例如foo(3))调用函数时,编译器知道您需要上述重载,因为3是一个右值。如果您将函数调用为foo(a),编译器将拾取原始版本的
foo(const int&a);
as
int a=2;
是一个左值


这将提供相同的调用语法。

如果存在
consteprintfoo(intx)noexcept;
则不会
foo(3)
是否在编译时计算?相关:@Arun,它将是。但是,您无法在
foo
中判断调用是在编译时还是在运行时进行的。为什么要千方百计使用
std::integral\u constant
?您可以在
模板void foo()处停止
对于简单的用例。否?@RSahu我只是觉得在某些情况下,将其作为参数更方便,所以我一直都在这样做。当然,你可以只做
foo()
。例如,这只是一个简单的宏函数-我以为提问者想要一个简单的函数替换,但他想要编译时计算。我的错。当然,右值!事实上,关键是让重载解析工作起来。非常感谢!那
foo(a+3)呢
?像
foo(a+b)这样的调用不会调用这个右值重载吗
?从问题来看,我不确定这是否是要求。这是一个很好的观点,@Arun。我没有比给出的例子想得更远。但我也不确定这是否是他的要求。@Arun是的,这最终违背了我问题的目的。然而,我最初的问题没有提到这一点,因此考虑到fac如果回答解决了给定的例子,我将把这个标记为答案。
void foo(int&& a);