gpt4 book ai didi

c++ - 来自 "check if member exists using enable_if"的修改代码不起作用

转载 作者:行者123 更新时间:2023-11-27 23:48:28 26 4
gpt4 key购买 nike

我读了这篇文章。 check if member exists using enable_if我像这样修改了 Johanness Schaub 的代码。

//////////////////////////////////////////////////////////////////////////
struct NormalChecker {
struct general_ {};
struct special_ : general_ {};
template<typename> struct int_ { typedef int type; };

template<typename Lhs>
void modify(Lhs &&lhs) {
cout << "modify\r\n";
modifyNormal(lhs, special_());
}

template<typename Lhs, typename int_<decltype(Lhs::normal)>::type = 0>
void modifyNormal(Lhs &&lhs, special_) {
cout << "modifyNormal with normal\r\n";
}

template<typename Lhs>
void modifyNormal(Lhs &&lhs, general_) {
cout << "modifyNormal without normal\r\n";
}
};

struct DataWithNormal {
int normal;
};

struct DataWithoutNormal {
};

int main() {
DataWithNormal with_normal;
DataWithoutNormal without_normal;

NormalChecker normalCheckerWithNormal;
normalCheckerWithNormal.modify(with_normal);
NormalChecker normalCheckerWithoutNormal;
normalCheckerWithoutNormal.modify(without_normal);

return 0;
}

但是,它只是说了两次“modifyNormal without normal”。我错过了什么?

最佳答案

Lhs 在您的示例中被推断为引用类型,特别是 DataWithNormal&。引用类型没有嵌套的 normal。解决这个问题的一种方法是在引用被剥离时检查 Lhs:

decltype(std::remove_reference<Lhs>::type::normal)

举 Igor 的评论,你也可以假装你有一个对象,因为访问一个对象的成员甚至可以使用引用:

decltype(std::declval<Lhs>().normal)

关于c++ - 来自 "check if member exists using enable_if"的修改代码不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48654991/

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