我希望从我的基类派生的所有类都具有以下功能:
class Derived : public Base{
public:
void doSth(const Derived& d){
...
}
}
是否可以在我的基类中强制执行此操作?
class Base{
public:
virtual void doSth(const Base& b) = 0; // ?
}
答案 0 :(得分:1)
否,因为您更改了虚拟函数的签名,所以虚函数没有帮助。 这是一个可能依赖C ++ 11功能的实现。它会正确检测具有所需签名的功能。
#include <type_traits>
template<typename, typename T>
struct has_doSth {
static_assert(
std::integral_constant<T, false>::value,
"Second template parameter needs to be of function type.");
};
// specialization that does the checking
template<typename C, typename Arg>
struct has_doSth<C, void(Arg)> {
private:
template<typename T>
static constexpr auto check(T*)
-> typename
std::is_same<
decltype( std::declval<T>().doSth( std::declval<Arg>()) ),
void
>::type; // attempt to call it and see if the return type is correct
template<typename>
static constexpr std::false_type check(...);
typedef decltype(check<C>(0)) type;
public:
static constexpr bool value = type::value;
};
template<typename T>
class Base {
public:
Base() {
static_assert(has_doSth<T, void(const T&)>::value, "Missing required function in the derived class.");
}
};
用法:
class WellDerived : public Base<WellDerived> {
public:
void doSth(const WellDerived& d){
...
}
};
class BadDerived : public Base<BadDerived> {
public:
void doSth(int d){
...
}
};