在 C++ 模板中省略参数

Posted

技术标签:

【中文标题】在 C++ 模板中省略参数【英文标题】:Omitting arguments in C++ Templates 【发布时间】:2009-07-17 22:55:47 【问题描述】:

调用模板函数时可以省略函数名后面的类型吗?

例如,考虑下面的函数:

template<typename T>
void f(T var)...

这样简单的称呼可以吗:

int x = 5;  
f(x);

或者我是否包含类型?

int x = 5;  
f<int>(x);

【问题讨论】:

你不能试试看会发生什么吗?似乎很容易测试。 @ Ed Swangren,“试一试”的方法信息量不大。充其量它会告诉您特定的编译器允许给定的语法。它没有告诉你关于语言标准的语句的语义或正确性。 我想我可以澄清这个问题。正如 Trent 友好地指出的那样,它是否能够编译并不是那么重要。我很好奇幕后发生的事情,很难找到好的信息! @Chris:我认为您接受的答案不是很好的信息。它甚至没有任何意义,并且遗漏了许多细节。 【参考方案1】:

只要编译器可以从函数参数中推断出模板参数,就可以将它们排除在外。这也是一种很好的做法,因为它会使您的代码更易于阅读。

另外,你只能留下结尾的模板参数,而不是开头或中间:

template<typename T, typename U> void f(T t) 
template<typename T, typename U> void g(U u) 

int main() 
    f<int>(5);      // NOT LEGAL
    f<int, int>(5); // LEGAL

    g<int>(5);      // LEGAL
    g<int, int>(5); // LEGAL

    return 0;

【讨论】:

【参考方案2】:

使用隐式模板参数调用它并没有错。编译器会通知您是否感到困惑,在这种情况下,您可能必须显式定义模板参数才能调用该函数。

【讨论】:

Zifre,我认为他的意思是“在这种情况下,您可能必须在函数调用中明确包含模板参数”。 我不谈论显式或隐式调用函数我谈论显式定义模板参数... @DeusAduro 你能解释一下吗?我考虑如何调用函数,它激发了我的设计/定义。您是在进行语义区分还是我误解了什么?

以上是关于在 C++ 模板中省略参数的主要内容,如果未能解决你的问题,请参考以下文章

C++模板的学习笔记

C++模板的学习笔记

可变参数模板和省略号有啥区别?

Visual Studio 不允许省略默认参数?

在 C++ 中使用默认参数跳过模板参数真的不可能吗,为啥语法建议不这样?

C++学习35 模板中的函数式参数