在C ++中,如果一个类有一个命名字段,typedef或method,那么在编译时可以获得SFINAE技巧。
我的问题是:我们还能以某种方式查询方法是否可访问?喜欢区分私人和公共方法。
例如,如果我有一个私有继承自std::vector
class T : private std::vector<int> { ... };
的类,我不想检测其begin
方法,因为它不可公开访问。
当搜索arround时,我只获得了检测方法的代码,没有关于可见性的内容......我得到的was this最接近继承方法,但不清楚它是如何与可见性交互的。显然我可以测试,但我关注特定于编译器的行为,因为我正在开发一个关于旧微软编译器的项目:\
编辑 /澄清:says here C ++标准改变了对此问题的看法:使用C ++ 03,任何可见或不可见的成员都是可替代的,但是从C ++ 11开始只有可见的成员。这是对的吗?
我使用下面的代码进行了一些测试,该代码检测到value_type
typedef。我不确定标准是什么,但是我编译了不同的编译器,结果如下:
true
| 4.5 true
| 4.6 true
| 4.7 true
| 4.8 false
| pre-4.9 false
fail
true
true
| 2010 true
| 2012 true
以下是代码:
#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;
}