如何从typedef获取模板类型

时间:2015-04-20 01:24:14

标签: c++ templates c++11

我的目标是使用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个字节的内存。

1 个答案:

答案 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,则无法编译,这可能没问题。