gpt4 book ai didi

c++ - 混合 decltype 和 enable_if

转载 作者:可可西里 更新时间:2023-11-01 18:36:08 24 4
gpt4 key购买 nike

似乎将 decltype 与 SFINAE enable_if 一起使用并不简单。我尝试以三种不同的方式使用 enable_if 编写 go。所有这些都因编译器错误而失败(GCC 的字面意思是:“错误:'thing' 不是 'foo' 的成员”和实例化上下文)。

#include <type_traits>

struct foo {
enum { has_thing = false };
};

struct bar {
enum { has_thing = true };
static int thing() { return 0; }
};

template <typename T>
struct Test {
/*auto go(typename std::enable_if<T::has_thing, int>::type=0)
-> decltype(T::thing()) {
return T::thing();
}*/

/*typename std::enable_if<T::has_thing, decltype(T::thing())>::type go() {
return T::thing();
}*/

template <bool B=T::has_thing, typename std::enable_if<B, int>::type = 0>
auto go() -> decltype(T::thing()) {
return T::thing();
}
};

int main() {
Test<bar> b;
Test<foo> f;
}

我可以看出问题所在 - decltype 需要在 enable_if 有机会排除该功能之前发生。剩下的问题是如何解决并获得类似的行为?有没有一种简单、通用的方法可以做到这一点,而无需诉诸编写 has_thing 特性以在 enable_if 中使用?

同时使用 G++ 4.7 和 clang++ 3.0 进行测试。

最佳答案

如果 go 方法是模板方法,SFINAE 将工作:

template <typename T>
struct Test {
template <class U = T>
auto go() -> decltype(U::thing()) {
return T::thing();
}
};

您也可以使用 has_thing 值,但没有必要这样做,因为 SFINAE 会在上面的示例中处理它:

template <class U = T, typename std::enable_if<U::has_thing, int>::type = 0>
auto go() -> decltype(U::thing()) {
return T::thing();
}

然后:

int main() {
Test<bar> b;
Test<foo> f;

b.go(); // Works!
f.go(); // Fails!
}

关于c++ - 混合 decltype 和 enable_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11292771/

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