首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板类的通键模式、好友问题和模板参数

模板类的通键模式、好友问题和模板参数
EN

Stack Overflow用户
提问于 2021-06-29 13:58:31
回答 1查看 121关注 0票数 2

这是经典的'passkey‘模式,它只允许在特定类的范围内访问函数:

代码语言:javascript
复制
#include <iostream>

template <typename T>
class passkey {
private:
  friend T;
  passkey() {}

  // noncopyable
  passkey(const passkey&) = delete;
  passkey& operator=(const passkey&) = delete;
};

struct A {
    A();
};

void g(int i, passkey<A>) {
    std::cout << i;
}

A::A(){g(42,{});} 

int main() {

    A a;

    return 0;
}

在这里,函数g只能在A中调用。但是,如果A现在是一个模板类,那么可以扩展它吗?下面的片段不编译(使用clang,但它适用于gcc.),因为对于模板朋友,似乎必须使用精心编写的类说明符,这似乎会导致声明冲突.

代码语言:javascript
复制
#include <iostream>

template <template<typename...> class T>
class passkey {
private:
  template<typename...> friend class T;
  passkey() {}

  // noncopyable
  passkey(const passkey&) = delete;
  passkey& operator=(const passkey&) = delete;
};

template<typename T>
struct A {
    A();
};

void g(int i, passkey<A>) {
    std::cout << i;
}

template<typename T>
A<T>::A(){g(42,{});} 

int main() {

    A<void> a;

    return 0;
}

这就发出了响亮的声音:

代码语言:javascript
复制
>source>:6:38: error: declaration of 'T' shadows template parameter
  template<typename...> friend class T;
                                     ^
<source>:3:39: note: template parameter is declared here
template <template<typename...> class T>

有什么办法让你做那件事吗?

EN

回答 1

Stack Overflow用户

发布于 2021-06-29 18:30:57

令我惊讶的是,你的各种模板竟然与GCC一起编译。我是这样写的:

代码语言:javascript
复制
template <template<typename... Ts> class T, typename... Ts>
class passkey {
  private:
    friend class T<Ts...>;

    constexpr passkey() {
      return;
    }
    passkey(passkey const&) = delete;
    passkey& operator=(passkey const&) = delete;
};

此外,我将让函数g接受一个r值引用,并显式地使用std::move调用它。

在这里试试!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68180206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档