因此,我遇到了一个问题,即我需要为从我创建的基类继承的任何类型定义一个方法,但是我需要该方法是静态的,是否仍然可以强制创建该方法?

我需要它的原因是,我将让人们扩展我的基类,但是我需要能够保证对类似这样的函数的调用,因此derivedType derivedType::createFromSerialized(std::string)可以从序列化创建新实例。

编辑:我试图遵循理查德·J·罗斯三世的建议并使用static_assert,但是我遇到了一些问题,由于它是从模板化类中调用的,因此我有一种感觉,但我不知道该怎么做要解决这个问题。

template <typename indType> class population {
        static_assert(std::is_function<indType::createFromSerialized>::value, "message");
....
};


但是,这给了我to refer to a type member of a template parameter, use ‘typename indType:: createFromSerialized’no type named 'createFromSerialized' in 'class test'错误

我尝试使用static_assert的原因是为了获得更好的错误消息,该消息将提供有关createFromSerialized正确函数签名的信息,而不仅仅是给出未定义函数签名的信息。

最佳答案

这可以通过结合static_assert和SFINAE检测技术来完成。

template<typename T, typename V = bool>
struct has_deserialize : std::false_type { };

template<typename T>
struct has_deserialize<T,
    typename std::enable_if<
        std::is_same<decltype(&T::createFromSerialized),
                     T* (*)(const std::string&)>::value,
        bool
        >::type
    > : std::true_type { };

template <typename T>
class test
{
  static_assert(has_deserialize<T>::value, "No suitable createFromSerialized");
};

10-06 12:47