我有两个功能:
void func(void* Buf);
template<class T> void func(T& val);
我希望使用数组或某个类型指针的调用将转到第一个调用。 使用类型调用时:int,double,long等 会去第二个,这可能吗?
现在,所有电话都转到第二个电话。
答案 0 :(得分:4)
现在,所有电话都转到第二个电话。
当然,void*
除外。这是因为,对于void*
以外的每种类型,模板都是更好的匹配。
也将第一个更改为模板。
template<class T> void func(T*);
这将更好地匹配指针和数组。
答案 1 :(得分:3)
您可以为func()
T
创建void*
的专用版本:
template<> void func(void*& val) {
}
而不是提供模糊的过载。
答案 2 :(得分:0)
您需要的功能称为部分模板专业化。它仅适用于类,因此您需要将您的函数转换为以下内容:
#include <iostream>
template <class T>
struct funct_t
{
static void exec(T &t)
{
std::cout << "T &" << std::endl;
}
};
template <class T>
struct funct_t<T *> // specialization for pointer like types
{
static void exec(T *t)
{
std::cout << "T *" << std::endl;
}
};
template <class T>
void funct(T t)
{
funct_t<T>::exec(t);
}
int main(int argc, char *argv[])
{
int x = 0;
int y[2];
funct(x);
funct(y);
return 0;
}