Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以更改专用模板函数的返回类型?_C++_Templates_Template Specialization - Fatal编程技术网

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

C++ 是否可以更改专用模板函数的返回类型?,c++,templates,template-specialization,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; } 模板结

以下是我想做的:

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

    int getNumber() { 
        return number; 
    }
};

template<> float banana<0>::getNumber() {
    return number;
}
模板结构{
浮点数;
香蕉(浮子){
数字=n;
}
int getNumber(){
返回号码;
}
};
模板:getNumber(){
返回号码;
}
因此,当一个新的香蕉被制作出来时,它会以浮点而不是整数的形式返回数字。编译器不会让我这么做的


我找到了一个看似相同的问题的答案(尽管,我可以用C++ 11,但是如果有区别的话,我不使用14),但是我不明白它是如何工作的,或者它是一样的。p> 专门化返回类型的一种简单方法是使用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;
    }
};
//第一种方法:条件
模板结构{
浮点数;
香蕉(浮子){
数字=n;
}
//C++14标准::条件
typename std::conditional::type
getNumber(){
返回号码;
}
};
或者按照您的建议,您可以使用模板专门化:

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;
    }
};
模板
结构香蕉返回类型
{
使用type=int;
};
模板
结构香蕉返回类型
{
使用类型=浮动;
};
模板结构bananaSecond{
浮点数;
巴纳纳秒(浮点数n){
数字=n;
}
typename香蕉返回类型::类型
getNumber(){
返回号码;
}
};
给定:

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

    int getNumber() { 
        return number; 
    }
};
模板结构{
浮点数;
香蕉(浮子){
数字=n;
}
int getNumber(){
返回号码;
}
};
此时,
banana
不是一个独特的用户定义类,而是一个模板的实例化,因此以下内容的格式不正确:

template<> float banana<0>::getNumber() {
    return number;
}
template::getNumber(){
返回号码;
}
您需要使
banana
成为一个明确定义的类:一个明确的模板专业化

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

    float getNumber() { 
        return number; 
    }
};
模板结构{
浮点数;
香蕉(浮子){
数字=n;
}
float getNumber(){
返回号码;
}
};

您的代码示例看起来非常荒谬。你到底想实现什么?在我看来,这不像是一个模板函数,更像是(模板化)类中的一个普通函数。这是我想添加到我的类中的质量的一个最小说明。真正的类是一个围绕模板类型数据数组的包装器,它应该始终返回浮点值。由于某些受支持的原始数据类型是整数,我需要重新解释它们,因此我返回一个代理,其中包含一个为括号运算符中的赋值运算符定义的setter函数。因此答案是“是的,但示例代码不是一个模板化函数,而是一个模板化类”。
banana
不作为单独的类存在,它只是一个模板的实例化(元函数的结果)。您需要将
banana
定义为一个不同的类(显式模板专门化)。我认为,对于这两种解决方案,您现在都可以按照OP想要的方式编写显式专门化,也就是说,类似于
template inline float banana::getNumber(){std::cout()