因此,我遇到了一个问题,即我需要为从我创建的基类继承的任何类型定义一个方法,但是我需要该方法是静态的,是否仍然可以强制创建该方法?
我需要它的原因是,我将让人们扩展我的基类,但是我需要能够保证对类似这样的函数的调用,因此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");
};