gpt4 book ai didi

c++ - 无效和非无效方法之间的 SFINAE 调度

转载 作者:搜寻专家 更新时间:2023-10-31 00:08:40 25 4
gpt4 key购买 nike

我有如下内容:

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' and 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,在我的示例中)。

P.s:无论如何,我没有看到返回 void

的问题

关于c++ - 无效和非无效方法之间的 SFINAE 调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47890613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com