【问题标题】:Can the types of parameters in template functions be inferred?可以推断模板函数中的参数类型吗?
【发布时间】:2019-06-25 16:24:36
【问题描述】:

我正在用 C++ 编写一些模板函数,但我不确定是否可以定义一个模板函数来推断其参数的类型。

我尝试定义一个带有推断参数类型的模板,但是这个示例无法编译:

template <auto>   
auto print_stuff(auto x, auto y) 
{ 
    std::cout << x << std::endl;
    std::cout << y << std::endl;
}

当我为每个参数类型指定一个唯一的名称时它会起作用,但这似乎有些多余:

#include <iostream> 
#include <string>

template <class Redundant_1,class Redundant_2>   
auto print_stuff(Redundant_1 x, Redundant_2 y) 
{ 
    std::cout << x << std::endl;
    std::cout << y << std::endl;
}

int main() 
{ 
    print_stuff(3,"Hello!");
    return 0; 
}

是否可以定义一个带有推断参数类型的模板,而不是给每个类型一个唯一的名称?

【问题讨论】:

  • template &lt;auto&gt; auto print_stuff(auto x, auto y) – 您现在要求两个autos 是同一类型(您只有一个模板参数!)还是与您的示例不同?
  • @Aconcagua 我希望每个auto 都是不同的类型,但template &lt;auto,auto&gt;... 也不起作用。
  • 如果你有相同数量的模板参数和函数参数,这完全可以工作。如果数字不同,编译器永远无法知道函数参数列表中的哪个自动匹配模板参数列表中的哪个自动。委员会可能已经考虑过要求两个具有相同大小的参数列表是一个太强的限制,不值得允许整个东西。不管是不是真正的原因,我亲自加入...

标签: c++ templates c++17 auto c++-concepts


【解决方案1】:

如果您的编译器支持概念,则可以省去模板头和参数类型的名称,即使要求实验性 C++2a 模式通常也不会启用。
例如,在 gcc 上,它必须使用 -fconcepts 单独启用。

见live on coliru。

#include <iostream> 
#include <string>

auto print_stuff(auto x, auto y) 
{ 
    std::cout << x << std::endl;
    std::cout << y << std::endl;
}

int main() 
{ 
    print_stuff(3,"Hello!");
    return 0; 
}

顺便说一句,避免std::endl 并在极少数情况下使用std::flush,您无法避免昂贵的手动冲洗。此外,return 0; 对于main() 是隐含的。

【讨论】:

  • return 0; is implicit for main - 也许,但许多人认为不这样做是不好的风格......
  • 我不熟悉 C++2a 规范...是否有原因 auto 是 print_stuff 而不是 void 的返回类型?
  • @Aconcagua Imho,对于minimal reproducible example,添加任何可选内容都是不好的风格。考虑到他到处使用std::endl...
  • @and 不,我只是靠近源头。从 C++14 开始,auto 可以用于返回类型推导,但这里它推导 void。
  • 嗯...你没有在main里面添加return,它已经在那里了,最后一句是可选的...所以现在它会是不好的风格吗? ;)
猜你喜欢
  • 2018-04-25
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多