如何确保某个类型的值只能由其朋友操纵?

时间:2012-01-12 01:39:19

标签: c++

我想创建一个类模板ptrs_and_refs_only<T>,它只能通过指针和引用进行操作。换句话说,除了声明为friend类型的事物外,不应该禁止使用此类型的值。

具体来说,我希望编译器在遇到用作函数参数的类型时发出错误:

void foo(ptrs_and_refs_only<int> x);  // error!
void bar(ptrs_and_refs_only<int> &x); // ok
void baz(ptrs_and_refs_only<int> *x); // ok

我知道我可以制作ptrs_and_refs_only<T>的复制构造函数private,但这似乎不会导致此代码出错:

template<typename T>
  class ptrs_and_refs_only
{
  private:
    ptrs_and_refs_only() {}
    ptrs_and_refs_only(const ptrs_and_refs_only &) {}
};

void foo(ptrs_and_refs_only<int> x) {}

int main()
{
  return 0;
}

这种行为可能吗?

1 个答案:

答案 0 :(得分:1)

这是一个骨架,但我不知道它是否适合您的需求:

#include <type_traits>

template <typename T>
struct notype
{
private:
  typename std::enable_if<std::is_constructible<notype<T>, T const &>::value,
                          void>::type dummy();
  notype(T &) { }
};

void foo(notype<int>)   { } // Error
void foo(notype<int> &) { }
void foo(notype<int> *) { }

您仍然需要找到一种方法来使类可以构造为某些客户端类。