我想创建一个类模板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;
}
这种行为可能吗?
答案 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> *) { }
您仍然需要找到一种方法来使类可以构造为某些客户端类。