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

时间:2015-08-23 07:05:32

标签: 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;
}

所以当新香蕉&lt; 0&gt;获取后,它将数字作为浮点数而不是整数返回。编译器不会让我这么做。

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

2 个答案:

答案 0 :(得分:4)

专门处理返回类型的一种简单方法是使用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

答案 1 :(得分:1)

假设:

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