gpt4 book ai didi

c++ - 需要推导参数*之前*用户参数的模板参数

转载 作者:行者123 更新时间:2023-11-30 03:18:44 27 4
gpt4 key购买 nike

我有一个函数,我希望其中的参数部分推导出来,而其余的(主要是非类型参数)由用户提供(作为强制在编译时提供它们的一种方式)。然而,这个非类型用户来源参数的类型是推导出来的,因此它必须在用户参数之前。这打破了用户推导出第一个参数的能力。我在下面有一个小例子,它没有编译,展示了我在说什么。

template <typename T, T N>
class int_const {};

template <typename T, T M, T N>
auto add(int_const<T, N> a) {
return int_const<T, N + M>();
}

int main(void) {
int_const<int, 1> a;
add<32>(a);
// add<int, 32>(a); does compile, but requires the user to know or extract that first argument
return 0;
}

有没有像 main() 中那样支持模板函数调用的方法?

最佳答案

如果可以使用C++17,则可以对M值使用auto

template <auto M, typename T, T N>
auto add(int_const<T, N> a) {
return int_const<T, N + M>();
}

所以你可以这样调用它

add<32>(a);

在 C++17 之前...好吧,我看不到不解释类型的方法。

正如 Jarod42 所指出的,auto M 还会拦截不同类型的值。

如果你想强制M的类型是exactly T,你可以使用SFINAE;举例如下

template <auto M, typename T, T N, 
std::enable_if_t<std::is_same_v<T, decltype(M)>, bool> = true>
auto add(int_const<T, N> a) {
return int_const<T, N + M>();
}

所以你从

得到错误
add<32u>(a);
add<short{32}>(a);

但也许你可以放宽要求并接受 decltype(M) 不完全是 T 而只是 M 是缩小可转换为 T

也许

template <auto M, typename T, T N>
auto add(int_const<T, N> a) {
return int_const<T, N + T{M}>();
} // .......................^^^^

所以

add<32u>(a);
add<short{32}>(a);

被编译是因为 32ushort{32} 正在缩小可转换为 int where

add<(unsigned long)(-1)>(a);

给出编译错误,因为 (unsigned long)(-1)(通常是 unsigned long 的更大可能值)不能缩小到 整数

关于c++ - 需要推导参数*之前*用户参数的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54413441/

27 4 0
文章推荐: android - 在 samsung duos 上通过 android 使用第二张 sim 卡发送短信
文章推荐: java - 将 List 传递给 Play Framework 中的 Jquery
文章推荐: java - 如何检测 ondraglistener 是否已经完成? (安卓)
文章推荐: java - 如何在 Iterator 中存储对象?