我有类似以下内容:
template <typename T>
struct Base {
auto func() {
// do stuff
auto x = static_cast<T&>(*this).func_impl();
// do stuff
return x;
}
};
struct A : Base<A> {
int func_impl() {
return 0;
}
};
struct B : Base<B> {
void func_impl() {
}
};
int main() {
A a;
int i = a.func();
B b;
b.func();
return 0;
}
问题是我无法func_impl
在派生类中声明的返回类型,void
如图所示B
。我试图使用SFINAE这样解决问题:
template <typename T>
struct Base {
template <typename = enable_if_t<!is_void<decltype(declval<T>().func_impl())>::value>>
auto func() {
// do stuff
auto x = static_cast<T&>(*this).func_impl();
// do stuff
return x;
}
template <typename = enable_if_t<is_void<decltype(declval<T>().func_impl())>::value>>
void func() {
// do stuff
static_cast<T&>(*this).func_impl();
// do stuff
}
};
但是编译器给出错误:invalid use of incomplete type 'struct A'
和invalid use of incomplete type 'struct B'
。有没有办法实现我想要的?
试试看
template <typename T>
struct Base {
template <typename U = T, typename = enable_if_t<!is_void<decltype(declval<U>().func_impl())>::value>>
auto func() {
// do stuff
return static_cast<T&>(*this).func_impl();
}
template <typename U = T, typename = enable_if_t<is_void<decltype(declval<U>().func_impl())>::value>>
void func() {
// do stuff
static_cast<T&>(*this).func_impl();
}
};
我的意思是... SFINAE应用于模板;如果要在类中启用/禁用方法,则它们必须是模板方法(该类/结构是模板的类/结构的事实不计算在内:必须是模板的方法。
SFINAE部分(std::enable_if_t
在这种情况下,必须)依赖于方法的模板(U
在我的示例中)。
附言:反正我看不到问题 void
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句