在C++中,如果一个类有一个命名的字段、ty以至方法,那么可以在编译时获得SFINAE技巧。
我的问题是:我们能否以某种方式询问一个方法是否是可访问的?比如区分私人方法和公共方法。
例如,如果有一个类私有地从std::vector
继承,比如class T : private std::vector<int> { ... };
,我不想检测它的begin
方法,因为它是不可公开访问的。
当我在说教时,我只得到检测方法的代码,没有关于可见性的任何信息.最近我得到的was this解决了继承的方法,但不清楚它是如何与可见性交互的。显然,我可以进行测试,但是我关心编译器的特定行为,因为我正在处理一个关于旧微软编译器的项目:\
编辑/:它认为C++标准改变了它对这个问题的看法:对于C++03,任何可见的或不可见的成员都是可替换的,但是因为C++11只有可见的成员。这是对的吗?
我对下面的代码进行了一些测试,该代码检测了value_type
类型胡枝子。我不知道标准是怎么说的,但是我用不同的编译器编译,结果如下:
true
,true
,4.5,true
,4.6,true
,4.7,true
,4.8,false
,4.9,前fail
true
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;
}
发布于 2014-03-05 10:26:11
https://stackoverflow.com/questions/22154011
复制相似问题