是否可以更改专门化模板函数的返回类型?

Is it possible to change return type of a specialized template function?

本文关键字:函数 返回类型 专门化 是否      更新时间:2023-10-16

我想这样做:

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

所以当一个新的香蕉<0>生成时,它会返回一个浮点数而不是整数。但是编译器不允许。

我找到了一个答案,似乎同样的问题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;
    }
};
演示

给定:

template<int I> struct banana {
    float number;
    banana(float n) {
        number = n;
    }
    int getNumber() { 
        return number; 
    }
};
在这一点上,banana<0>不是一个不同的用户定义类,而是一个模板的实例化,所以下面是不正确的:
template<> float banana<0>::getNumber() {
    return number;
}

你需要使banana<0>是一个明确定义的类:一个显式的模板专门化

template<> struct banana<0> {
    float number;
    banana(float n) {
        number = n;
    }
    float getNumber() { 
        return number; 
    }
};