C++ 模板特化和函数返回值
C++ template specialization and function returned value
如何将以下示例中的 getValue() 函数专门化为 return 基于类型的值?如何在 class 定义中实现这一点?可能吗?
template <typename Type>
class Abc
{
public:
Type init;
Abc() : init(getValue()) {}
private:
template<> static uint8_t getValue() { return 123; }
template<> static uint16_t getValue() { return 45678; }
};
您可以使用 std::is_same
编写一个非模板函数,returns 一个值取决于 class 的模板参数:
template <typename Type>
class Abc
{
...
static Type getValue() {
if (std::is_same<Type, std::uint8_t>::value) {
return 123;
} else if (std::is_same<Type, std::uint16_t>::value) {
return 45678;
}
}
};
这个例子非常简单,可以用 C++11 编译:无论 Type
是 uint8_t
还是 [=16=,两个 return
语句都是有效的].但是,如果它变得更复杂,您可能必须使用 C++17 的 constexpr if
,例如:
static Type getValue() {
if constexpr (std::is_same<Type, std::uint8_t>::value) {
return 123;
} else if constexpr (std::is_same<Type, std::uint16_t>::value) {
return 45678;
} else if constexpr (std::is_same<Type, const char *>::value) {
return "9abcdef";
}
}
如何将以下示例中的 getValue() 函数专门化为 return 基于类型的值?如何在 class 定义中实现这一点?可能吗?
template <typename Type>
class Abc
{
public:
Type init;
Abc() : init(getValue()) {}
private:
template<> static uint8_t getValue() { return 123; }
template<> static uint16_t getValue() { return 45678; }
};
您可以使用 std::is_same
编写一个非模板函数,returns 一个值取决于 class 的模板参数:
template <typename Type>
class Abc
{
...
static Type getValue() {
if (std::is_same<Type, std::uint8_t>::value) {
return 123;
} else if (std::is_same<Type, std::uint16_t>::value) {
return 45678;
}
}
};
这个例子非常简单,可以用 C++11 编译:无论 Type
是 uint8_t
还是 [=16=,两个 return
语句都是有效的].但是,如果它变得更复杂,您可能必须使用 C++17 的 constexpr if
,例如:
static Type getValue() {
if constexpr (std::is_same<Type, std::uint8_t>::value) {
return 123;
} else if constexpr (std::is_same<Type, std::uint16_t>::value) {
return 45678;
} else if constexpr (std::is_same<Type, const char *>::value) {
return "9abcdef";
}
}