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

use*_*993 3 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;
}
Run Code Online (Sandbox Code Playgroud)

因此,当创建一个新的 Banana<0> 时,它会返回浮点数而不是整数。但编译器不会让我这样做。

我找到了看似相同问题的答案/sf/answers/1113855991/(尽管如此,我可以使用 c++ 11 但不能使用 14,如果这有影响的话),但我不明白它是如何工作的或如果它是同一件事的话。

Den*_*ank 6

专门化返回类型的一个简单方法是使用 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;
    }
};
Run Code Online (Sandbox Code Playgroud)

或者正如您所建议的,您可以使用模板专业化:

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

演示