我正在尝试编写一个在这两种情况下都能正常工作的模板函数。我有两个功能:
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函数的代码,它们是类的内部代码,因此我可以根据需要调整它们的接口。
答案 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