模板函数中的参数类型可以推断吗?
Can the types of parameters in template functions be inferred?
我正在用 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-header 和 parameter-types 的名称,即使要求实验性 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()
是隐式的。
我正在用 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-header 和 parameter-types 的名称,即使要求实验性 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()
是隐式的。