使用模板时,如何控制调用哪个函数

时间:2015-05-10 19:29:58

标签: c++ templates

我有两个功能:

void func(void* Buf);
template<class T> void func(T& val);

我希望使用数组或某个类型指针的调用将转到第一个调用。 使用类型调用时:int,double,long等 会去第二个,这可能吗?

现在,所有电话都转到第二个电话。

3 个答案:

答案 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;
}