1
4

1 回答 1

1

您可以通过创建一个专门版本的 Setting 来做到这一点,该版本仅在设置类型继承自 Serializable 时才可用。

通过使用部分模板专业化,std::enable_if您可以创建一个单独的 Settings 类,该类仅在 Setting 类型实现时使用Serializable

例如:

// Normal Setting class, for the primitive types your backend supports
template <typename T, typename _ = void>
class Setting {
    std::string m_name;
    T m_defaultValue;

public:
    T load() {
        if(backend.contains(m_name))
            return backend.load<T>(m_name);
        return m_defaultValue;
    }

    void save(const T &value) {
        backend.save(m_name, value);
    }
};

// specialized Setting class that will apply to all classes that implement Serializable
template<typename T>
class Setting<T, std::enable_if_t<std::is_base_of_v<Serializable, T>>> {
    std::string m_name;
    T m_defaultValue;

public:
    T load() {
        if(backend.contains(m_name)) {
            T s;
            s.deserialize(backend.load<std::string>(m_name));
            return s;
        }

        return m_defaultValue;
    }

    void save(const T &value) {
        backend.save(m_name, value.serialize());
    }
};

这里有一个例子godbolt

于 2021-10-26T19:16:11.000 回答