【发布时间】:2020-10-05 13:34:27
【问题描述】:
我有this 代码
#include <iostream>
#include <type_traits>
enum class Color: char { Red = 'r', Yellow = 'y', Green = 'g' };
template<Color color>
auto say_my_name(unsigned times = 1) {
for (unsigned i = 0; i < times; i++) {
std::cout << static_cast<std::underlying_type_t<Color>>(color) << ' ';
}
std::cout << std::endl;
}
constexpr auto say_red = say_my_name<Color::Red>;
int main()
{
say_my_name<Color::Yellow>(3);
say_my_name<Color::Yellow>();
say_red(2);
say_red(); // too few arguments to function
}
我希望函数say_red 是say_my_name 的特化,所以我可以在我的代码中轻松调用它,而无需一直提供模板参数。
say_red(2) 工作正常,但 say_red() 无法编译并显示错误消息 “错误:函数的参数太少”
有没有办法让我的代码在不指定参数的情况下编译?
附带说明:如果这样可以解决问题,我也可以将模板参数转换为函数参数。我的问题是,std::bind 在 C++17 中不是 constexpr,所以这不适合我。
此外,我不想在say_* 的每个声明中指定默认参数。可以想象,这是一个示例,而我的“现实生活”枚举有 8 个变体,所以我想尽可能少写代码。
【问题讨论】:
-
问题是
say_red是一个指向带有签名void(unsigned)的函数的指针(并且它不带有默认参数),即使编译器可以知道哪个特定函数 @987654332 @ 指向它不能知道每种情况。 (例如,如果constexpr auto say_red = get_function_pointer();是通过这种方式获得的)。
标签: c++ c++17 template-specialization specialization