是否可以更改 return 类型的专用模板函数?
Is it possible to change return type of a specialized template function?
这是我想做的事情:
template<int I> struct banana {
float number;
banana(float n) {
number = n;
}
int getNumber() {
return number;
}
};
template<> float banana<0>::getNumber() {
return number;
}
因此,当制作出新的香蕉<0>时,它returns将数字作为浮点数而不是整数。编译器不会让我。
我找到了看似相同问题的答案(尽管如此,我可以使用 c++ 11 但不能使用 14,如果这有所不同)但我不明白它是如何工作的,或者它是否甚至同一件事情。
专门化 return 类型的一种简单方法是使用 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>
不是一个独特的用户定义 class,而是一个模板的实例化,所以下面是错误的:
template<> float banana<0>::getNumber() {
return number;
}
您需要使 banana<0>
是一个明确定义的 class:一个明确的模板特化。
template<> struct banana<0> {
float number;
banana(float n) {
number = n;
}
float 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;
}
因此,当制作出新的香蕉<0>时,它returns将数字作为浮点数而不是整数。编译器不会让我。
我找到了看似相同问题的答案(尽管如此,我可以使用 c++ 11 但不能使用 14,如果这有所不同)但我不明白它是如何工作的,或者它是否甚至同一件事情。
专门化 return 类型的一种简单方法是使用 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>
不是一个独特的用户定义 class,而是一个模板的实例化,所以下面是错误的:
template<> float banana<0>::getNumber() {
return number;
}
您需要使 banana<0>
是一个明确定义的 class:一个明确的模板特化。
template<> struct banana<0> {
float number;
banana(float n) {
number = n;
}
float getNumber() {
return number;
}
};