【发布时间】:2017-09-19 09:46:04
【问题描述】:
我有以下课程
template<typename T>
class A
{
public:
A(T* d) : ptr(d)
{}
A(const T* d) : ptr(const_cast<T*>(d))
{}
T* Ptr()
{
static_assert(???, "Not allowed when using A(const T* d)");
return ptr;
}
const T* Ptr() const
{
return ptr;
}
private:
T* ptr;
}
我怎样才能在编译 Ptr() 时知道使用哪个构造函数来创建这个对象?我想静态断言在编译 Ptr() 时使用了构造函数 A(T* d):
unsigned char* ptr = new unsigned char[10];
const unsigned char* cptr = new unsigned char[10];
A a(ptr);
A ca(cptr);
a.Ptr(); // Compiles
ca.Ptr(); // Gives compile error
如果程序员在使用 const ptr 创建类 A 的对象时调用 Ptr(),我想检测编译时间。不允许使用 const ptr 创建时调用 Foo
我想这样使用它
void Foo(A<int>& r)
{
....
int* ptr = a.Ptr();
....
}
void Bar(const A<int>& r)
{
...
}
...
A a(ptr);
A ca(cptr);
Bar(a);
Bar(ac);
Foo(a);
Foo(ac);// Gives compile error
【问题讨论】:
-
也许你应该解释一下为什么你认为你需要知道调用了什么构造函数。使用
static_assert不是解决方案 -
如果您真的需要这些信息,构造函数当然可以将信息保存在成员
is_const = false和is_const = true中。否则,获取常量对象的传统方法是const A ca(cptr);。 -
你是否尝试过创建第二个构造函数
private? -
@ypnos 更好,
= delete它,参见例如stackoverflow.com/questions/5702100/… -
@W.F.:我的意思是,所提出的问题看起来就像类的 const 正确性很差,而 OP 正试图通过禁止调用某些成员函数来解决这个问题。可以说,您的解决方案在某种意义上“修复”了 API,但基本问题(在存储指针之前抛弃常量)仍然存在。