是否可以判断方法是否可以在编译时公开访问

时间:2014-03-03 18:04:52

标签: c++ visibility sfinae

在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。我不确定标准是什么,但是我编译了不同的编译器,结果如下:

  • gcc:4.4 true | 4.5 true | 4.6 true | 4.7 true | 4.8 false | pre-4.9 false
  • Clang:3.3 fail
  • icc:13 true
  • msvc:2005 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;
}

1 个答案:

答案 0 :(得分:0)

正如您在example的评论中所述:

  

“建议的SFINAE仅在方法公开时才有效”

因此,它只会检测应解决您问题的公共方法。