gpt4 book ai didi

c++ - 参数的重载函数(不可)在编译时推导

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:51:50 27 4
gpt4 key购买 nike

有没有一种方法可以通过重载函数来区分参数是在编译时可评估还是仅在运行时可评估?

假设我有以下功能:

 std::string lookup(int x) {
return table<x>::value;
}

这允许我在恒定时间内(有空间开销)基于参数 x 选择一个字符串值。然而,在某些情况下 x 无法在编译时提供,我需要运行一个 foo 版本,它以更高的时间复杂度进行查找。

我当然可以使用不同名称的函数,但我希望有一个统一的界面。


我接受了一个答案,但我仍然对完全相同的函数调用是否可以进行这种区分感兴趣。

最佳答案

我相信你能得到的最接近的是重载 lookupintstd::integral_constant<int> ;然后,如果调用者知道编译类型的值,他们可以调用后者重载:

#include <type_traits>
#include <string>

std::string lookup(int const& x) // a
{
return "a"; // high-complexity lookup using x
}

template<int x>
std::string lookup(std::integral_constant<int, x>) // b
{
return "b"; // return table<x>::value;
}

template<typename T = void>
void lookup(int const&&) // c
{
static_assert(
!std::is_same<T, T>{},
"to pass a compile-time constant to lookup, pass"
" an instance of std::integral_constant<int>"
);
}

template<int N>
using int_ = std::integral_constant<int, N>;

int main()
{
int x = 3;
int const y = 3;
constexpr int z = 3;
lookup(x); // calls a
lookup(y); // calls a
lookup(z); // calls a
lookup(int_<3>{}); // calls b
lookup(3); // calls c, compile-time error
}

Online Demo

注意事项:

  • 我提供了一个 int_ helper 在这里构建 std::integral_constant<int>对调用者来说不那么冗长;这是可选的。
  • 重载 c 会有假阴性(例如 constexpr int 变量被传递给重载 a,而不是重载 c),但这会清除任何实际的 int 文字。

关于c++ - 参数的重载函数(不可)在编译时推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34792644/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com