重载函数调用编译时常量

时间:2015-04-22 14:34:03

标签: c++ c++11

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

例如:

int a = 2;
foo( a )  // #1: Compute at run-time
foo( 3 )  // #2: Compute at compile-time

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

我查看了constexpr,但函数参数不能是constexpr。拥有相同的调用语法会很好,但能够根据文字类型的参数生成不同的代码。

2 个答案:

答案 0 :(得分:8)

您无法区分编译时文字int和运行时变量int。如果需要执行此操作,则可以提供只能在编译时工作的重载:

void foo(int ); // run-time

template <int I>
void foo(std::integral_constant<int, I> ); // compile-time

答案 1 :(得分:2)

我认为上述答案在某种程度上错过了问题试图提出的观点。

  

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

这是一个&#39;右值参考&#39;是为了。文字类型是右值。

  

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

你可以简单地重载你的foo()函数:

void foo(int&& a);

因此,当您使用文字调用该函数时,例如foo(3),编译器知道你需要上面的重载,因为3是一个rvalue。如果您将函数称为foo(a),编译器将选择原始版本foo(const int& a);,因为int a=2;是左值。

这会给你相同的调用语法。