C++在功能
问题描述:
我现在有把指针这个宏C++在功能
#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; }
答
申报R作为参考,以改变它:
template<typename T1, typename T2>
void bind(T1 obj,
T2 &r) //<-- here
{
assert(sizeof(*r) == 1);
r = reinterpret_cast<T2>(obj);
};
模板变换操作?会是什么样子? – 2012-07-16 20:12:26
@迈克尔:花了一些时间把它全部输入,但在这里。 – 2012-07-16 20:12:46