模板函数

时间:2016-09-05 04:24:09

标签: c++ templates c++11

我正在尝试编写一个在这两种情况下都能正常工作的模板函数。我有两个功能:

template <typename T>
Check(T&)

template <typename U, typename V>
Check(U&, V&)

我有一个函数,我想编写一个单独的实现,在任何其他类型的情况下,我希望它调用Check(T&amp;),如果我们有一个std :: pair,那么它应该调用Check的两个参数变量。换句话说,代码如:

void SomeFunction() {
  ...
  if (type(x) is std::pair<U,V>)
    Check(x.first, x.second);
  else
    Check(x);
  ...
}

有没有办法使用模板魔术来完成这种行为?代码应该最好使用C ++ 11。我拥有Check函数的代码,它们是类的内部代码,因此我可以根据需要调整它们的接口。

3 个答案:

答案 0 :(得分:1)

你的意思是这样吗?它提供了一个只对pair有效的重载,并调用了2参数函数。

#include <iostream>
#include <utility>

template <typename T>
void Check(T& t)
{
    std::cout << "single argument version " << t << '\n';
}

template <typename U, typename V>
void Check(U& u, V& v)
{
    std::cout << "pair version " << u << " and " << v << '\n';
}

template<typename T>
void call(T& t)
{
    Check(t);
}

template<typename T, typename U>
void call(const std::pair<T, U>& t)
{
    Check(t.first, t.second);
}

int main()
{
    int i = 1;

    call(i);
    call(std::pair<int, char>(2, 'c'));
}

答案 1 :(得分:1)

处理此类事情的常用方法是将依赖于类型的部分拆分为单独的,部分重载的函数集:

template <typename T>
void do_check(T& t) {
    Check(t);
}

template <typename U, typename V>
void do_check(std::pair<U, V>& p) {
    Check(p.first, p.second);
}

void SomeFunction() {
    ...
    do_check(x);
    ...
}

答案 2 :(得分:1)

只需添加一个重载

void SomeFunction() {
    // ...
    Check(x);
    // ...
}

你的代码就是

touch -d