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 编译:无论 Typeuint8_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";
        }
    }