gpt4 book ai didi

c++ - 如何使这个 boost::enable_if 代码编译(SFINAE)?

转载 作者:太空狗 更新时间:2023-10-29 19:59:40 24 4
gpt4 key购买 nike

我很困惑为什么下面的代码使用了boost::enable_if不编译。它检查类型是否 T有一个成员函数 hello如果是这种情况,则调用它:

#include <iostream>
#include <boost/utility/enable_if.hpp>
#include <boost/static_assert.hpp>

// Has_hello<T>::value is true if T has a hello function.
template<typename T>
struct has_hello {
typedef char yes[1];
typedef char no [2];
template <typename U> struct type_check;
template <typename U> static yes &chk(type_check<char[sizeof(&U::hello)]> *);
template <typename > static no &chk(...);
static const bool value = sizeof(chk<T>(0)) == sizeof(yes);
};

template<typename T>
void doSomething(T const& t,
typename boost::enable_if<typename has_hello<T>::value>::type* = 0
) {
return t.hello();
}

// Would need another doSomething` for types that don't have hello().

struct Foo {
void hello() const {
std::cout << "hello" << std::endl;
}
};

// This check is ok:
BOOST_STATIC_ASSERT(has_hello<Foo>::value);

int main() {
Foo foo;
doSomething<Foo>(foo);
}

我得到了

no matching function for call to ‘doSomething(Foo&)

gcc 4.4.4 .

静态断言没问题,所以has_hello<Foo>::value确实是true .我在使用 boost::enable_if 吗?错了吗?

最佳答案

boost::enable_if 的第一个参数必须是一个类型,包含一个名为value 的静态bool 常量.您需要的是采用非类型 bool 参数的 enable_if_c 模板(注意 _c 后缀)。

template<typename T>
void doSomething(T const& t,
typename boost::enable_if_c<has_hello<T>::value>::type* = 0
) {
return t.hello();
}

compiles and runs很好。

也在 Paragraph 2 in boost docs. 下解释

关于c++ - 如何使这个 boost::enable_if 代码编译(SFINAE)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12028527/

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