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()