c++ - 是否可以更改专用模板函数的返回类型?

标签 c++ templates template-specialization

这是我想做的:

template<int I> struct banana {
    float number;
    banana(float n) {
        number = n;
    }

    int getNumber() { 
        return number; 
    }
};

template<> float banana<0>::getNumber() {
    return number;
}

所以当一个新的 banana<0> 被制作出来时,它会以 float 而不是整数形式返回数字。编译器不会让我。

我找到了看似相同问题的答案 https://stackoverflow.com/a/15912228/4049658 (尽管如此,我可以使用 c++ 11 但不能使用 14,如果这有所不同)但我不明白它是如何工作的,或者它是否是同一回事。

最佳答案

专门化返回类型的一种简单方法是使用 std::conditional:

// First approach: conditional
template<int I> struct banana {
    float number;
    banana(float n) {
        number = n;
    }

    // C++14 std::conditional_t<I == 0, float, int>
    typename std::conditional<I == 0, float, int>::type
    getNumber() {
        return number;
    }
};

或者如您所建议的那样,您可以使用模板特化:

template<int /*I*/>
struct banana_return_type
{
    using type = int;
};

template<>
struct banana_return_type<0>
{
    using type = float;
};

template<int I> struct bananaSecond {
    float number;
    bananaSecond(float n) {
        number = n;
    }

    typename banana_return_type<I>::type
        getNumber() {
        return number;
    }
};

Demo

关于c++ - 是否可以更改专用模板函数的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32164104/

相关文章:

c++ - std::atomic 到底是什么?

c++ - ‘节点’: use of class template requires template argument list

templates - Golang 模板 (helm) 遍历 map 列表

c++ - 是否有理由在 header 中保留完全专业的模板?

c++ - Clang 拒绝仅通过专门化定义类模板的嵌套类的代码是否正确?

c++ - 如何以与 OpenGL 中的点 Sprite 相同的方式渲染屏幕对齐的矩形

c++ - 从 time_t 到 const time_t* 的转换无效

c++ - 对 Mat 矩阵执行简单的逆运算和乘法运算

c++ - 具有需要构造函数参数的基类的装饰器

c++ - 模板特化与另一个模板