我目前有这个宏
#define bind(OBJECT, ROLE) \
assert( sizeof(*ROLE) == 1 ); \
ROLE = reinterpret_cast<decltype(ROLE)>(OBJECT);
它导致了一些名称冲突问题,所以我想将它移到一个模板化函数中,例如
template<typename T1, typename T2>
void bind(T1 obj, T2 r) {
assert( sizeof(*r) == 1 );
r = reinterpret_cast<T2>(obj);
};
但是,我怀疑这是不可能的,但想确认一下吗?为了改变 r,我必须有一个指向指针的指针吗?
最佳答案
你至少需要一个引用:
template<typename T1, typename T2>
void bind(T1 obj, T2& r)
{
assert( sizeof(*r) == 1 );
r = reinterpret_cast<T2>(obj);
}
另一种选择是使用模板转换运算符。然后你可以调用语法:
ROLE = bind(OBJ);
代码大概是这样的:
template<typename T1> class auto_converter
{
const T1& value;
public:
auto_converter(const T1& v) : value(v) {}
// template conversion operator
template<typename T2>
operator T2() const
{
assert(sizeof (*T2()) == 1);
return reinterpret_cast<T2>(value);
}
};
template<typename T1>
autoconverter<T1> bind(const T1& obj) { return obj; }
关于C++ 在函数中转换指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11511729/