无法调用具有默认参数的函数专业化,因为参数太少

你好

我有这个代码

#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不在constexprC++17 中,所以这不适合我。
此外,我不想在每个声明中指定默认参数say_*你可以想象,这是一个例子,我的“现实生活”枚举有 8 个变体,所以我想写尽可能少的代码。

463035818_is_not_a_number

默认参数在调用站点被替换。它们不是函数类型的一部分。因此,您需要“某物”来启用say_red. 您可以使用 lambda:

#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 = [](unsigned times = 1){
    say_my_name<Color::Red>(times);
};

int main()
{
    say_my_name<Color::Yellow>(3);
    say_my_name<Color::Yellow>();
    say_red(2);
    say_red(); // too few arguments to function
}

如果您不介意()在每次调用时添加一个,您可以使用函子:

#include <iostream>
#include <type_traits>

enum class Color: char { Red = 'r', Yellow = 'y', Green = 'g' };

template<Color color>
struct say_my_name {
    void operator()(unsigned times = 1) const {
        for (unsigned i = 0; i < times; i++) {
            std::cout << static_cast<std::underlying_type_t<Color>>(color) << ' ';
        }
        std::cout << std::endl;
    }
};

using 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
}

如果你不喜欢额外的,()你可以这样做:

using say_red = say_my_name<Color::Red>;
constexpr auto red_say = say_red{};

int main()
{
    red_say(2);
    red_say(); // too few arguments to function
}

请注意,您也可以使用构造函数代替operator(),但 usingoperator()更灵活,因为它允许您返回一个值。关键是分两步进行特化和重载解析(特化函子然后operator()用一个或零个参数调用)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用反射调用具有默认参数值的函数

带有默认参数的模板专业化

具有部分专业化的类模板参数推导

具有更多模板参数的部分专业化

具有功能模式参数的部分专业化

具有模板模板参数的类模板专业化

C ++ 11中具有多个模板参数的模板函数的专业化

具有非类型参数的类的具有非类型参数的成员函数的部分专业化

从修改默认值的函数调用具有不同默认参数的多个函数

如何使用具有参数化返回类型的函数参数调用函数

带有可变参数模板参数的成员函数的显式专业化

从Java调用具有命名/默认参数的Clojure函数的最佳方法

如何在继承层次结构中调用具有默认参数的构造函数?

尝试从另一个名称空间调用具有相同名称的函数时,函数调用中的参数太少

局部专业化的默认参数[Clang是,GCC否]

调用具有默认参数的方法时,代码无法编译

可变参数模板是否必须具有非空参数包的可调用专业化格式,以便格式正确?

具有默认参数的PHP调用函数

可变参数模板函数名称查找无法找到专业化

具有多个条件的默认模板专业化

具有默认值的模板专业化

具有非类型参数的部分模板专业化:GCC与MSVS

具有非空模板参数列表的模板专业化

具有std :: enable_if的C ++可变参数模板部分模板专业化

具有任何非类型参数的C ++模板专业化

具有std :: if_enabled_t参数的模板功能的完全专业化

专业化可变参数模板成员函数

可变参数模板成员函数的部分专业化

以函数为模板参数的部分专业化拒绝