C ++概念,具有类似朋友的访问权限

时间:2016-05-18 09:36:39

标签: c++ friend c++17 c++-concepts

是否可以按照我的意愿使这段代码正常工作?即允许概念访问私有成员函数吗?

template <typename T>
concept bool Writeable()
  { return requires (T x,std::ostream os) { { x.Write(os) } -> void }; }

template <Writeable T>
void Write(std::ostream &os,const T &x) { x.Write(os); }

class TT
{
private:
  void Write(std::ostream &os) const { os << "foo"; }

//friend concept bool Writeable<TT>();
friend void ::Write<TT>(std::ostream &,const TT &);
};

由于

1 个答案:

答案 0 :(得分:3)

没有。明确的概念不允许成为朋友。

n4377 7.1.7 / 2

  

每个概念定义都被隐含地定义为constexpr   声明(7.1.5)。概念定义不得声明   thread_local,inline,friend或constexpr说明符,也不应该   概念定义有相关的约束(14.10.2)。

我们可以将其缩小到此示例,以显示访问确实是问题:

template <typename T>
concept bool Fooable = requires (T t) { { t.f() } -> void };

struct Foo
{
private:
    void f() {}
};


int main()
{
    static_assert(Fooable<Foo>, "Fails if private");
}

然而,您可以使用间接级别,如下所示:

template <typename T>
void bar(T t) { t.f(); }

template <typename T>
concept bool FooableFriend = requires(T t) { { bar(t) } -> void };

struct Foo
{
private:
    void f() {}

    template<typename T>
    friend void bar(T t);
};


int main()
{
    static_assert(FooableFriend<Foo>, "");
}

Live demo incorporating your example

哪个有效。概念很早,所以我想他们可能会解除friend限制,因为提案已经解除了对C ++ 11/14功能的限制。