我的目标是使用INT16自动替换 ???? ,而不将INT16作为模板参数传递:
#include <windows.h>
typedef Address<INT16> Address2Bytes;
// Address is a class made by me with constructor Address<Data>(const char*, const Data&)
template <typename Addr>
void doStuff(const char* addressName, const ????& addressData)
{
Addr address(addressName, addressData);// This variable MUST be created here
// Do stuff
}
void main(void)
{
doStuff<Address2Bytes>("name", 0x0);// Can't pass INT16 as a template (please don't ask why)
}
解释为什么我不能用INT16替换: 真正的doStuff函数是这样的:
template <typename Addr>
void freeze(const String& processName, const String& addressName, const ????& data)
{
Process process = processes[processName];
Addr& address = process.getAddress<Addr>(addressName);
address.data = data;
address.frozen = true;
}
这是一个库函数,库用户不需要知道INT16是什么,他只需要知道地址指向2个字节的内存。
答案 0 :(得分:0)
首先,你可以推断出addressData
的类型,如果类型无效,那么函数就无法在构造函数中编译:
template <typename Addr, typename DataType>
void doStuff(const char*, const DataType& );
如果由于某种原因不能令人满意,您可以使用类型特征来确定Address
上的模板类型:
template <typename T> struct address_type;
template <typename T>
struct address_type<Address<T> > {
typedef T type;
};
然后您可以在函数中使用它:
template <typename Addr>
void doStuff(const char* addressName,
const typename address_type<Addr>::type& addressData)
{ .. }
当您致电doStuff<Address2Bytes>
时,它将实例化address_type<Address2Bytes>
模板,其type
成员将为INT16
。如果您尝试使用不是doStuff
的类型调用Address
,则无法编译,这可能没问题。