C++函数模板指定第二个模板参数类型

10

我刚开始学习模板编程,以下是我的代码:

template<typename T, typename U>
void add(T x, U y)
{
    cout<< x + y <<endl;
}

我可以通过以下方式调用它:
add(1, 2);
add<int, int>(1, 2);
add<int>(1, 2.0);

在第三种情况下,我相信那意味着我指定了[T=int],编译器会推断出[U=double]
我的问题是如何明确指定第二个参数类型?

3
如果您想指定第二个参数,则也必须指定第一个参数。没有 add<_, double> - Jarod42
1
只是为了澄清,您想指定 U 但不包括 T 吗?这是不可能的。 - Some programmer dude
1
你实际上想要做什么?听起来像是 add<int,double>(1, 2.0) 或者 add<int>(1, float(2.0)) 可能是你想要的,但这似乎是一个过于显然的解决方案。 - Ken Y-N
1
“@Someprogrammerdude说‘不可能’,我相信肯定会有人接受挑战,想出一种方法来做到!” - Ken Y-N
显示剩余3条评论
1个回答

6

关于 add(1,(int)2.0); 的问题。

按照模板参数推导规则,在理论上,这将导致第二个模板参数被推导为 int。因此,严格地说,这与这种假设的语法等效:add<U=int>(1,2.0);

因此,这是指定第二个模板参数的方法!

如果第二个模板参数不可推导,则无法找到等效的语法:

template<class T>
struct t_{
  using type = T;
  };

template<class T,class U>
auto add(T, typename t_<U>::type);

3
add<auto, int>(1, 2.0); 这行代码是类似于 C++ 的语法,但并不存在于该语言中。这可能会被提议用于 C++20 标准。它的意思是将整数 1 和浮点数 2.0 相加,使用自动类型推导来确定返回值类型为 int。 - Aconcagua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接