在C++中,如果类具有命名字段、typedef或方法,则在编译时需要使用SFINAE技巧。
我的问题是:我们是否也可以以某种方式查询一个方法是否可以访问?比如区分私人和公共方法。
例如,如果我有一个像class T : private std::vector<int> { ... };
一样从std::vector
私有继承的类,我不想检测它的begin
方法,因为它是不可公开访问的。
当搜索around时,我只得到检测方法的代码,而不是可见性。。。我得到的最接近的是这个,它解决了继承的方法,但不清楚它是如何与可见性交互的。很明显,我可以测试,但我关心编译器特定的行为,因为我正在做一个关于旧微软编译器的项目:\
编辑/澄清:这里说C++标准改变了它对这个问题的看法:在C++03中,任何可见或不可见的成员都是可替代的,但由于C++11,只有可见的成员是可替换的。这是正确的吗?
我用下面的代码做了一些测试,它检测value_type
typedef。我不确定标准是怎么说的,但我用不同的编译器进行了编译,结果如下:
- gcc:4.4
true
|4.5true
|4.6true
|4.7true
|4.8false
|4.9false
之前 - Clang:3.3
fail
- icc:13
true
- msvc:2005
true
|2010true
|2012true
这是代码:
#include <vector>
typedef char yes;
typedef int no;
template<class T> struct has_value_type {
template<class U> static yes test(typename U::value_type*);
template<class U> static no test(...);
static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};
class C : private std::vector<int> { };
int main() {
return has_value_type<C>::value;
}
如您发现的示例注释所述:
"建议的SFINAE仅在方法是公共的情况下有效">
因此,它将只检测应该解决您的问题的公共方法。