0

对于结构

<template typename T>
struct Foo
{
 ...
}

<template typename T>
struct Boo
{
 ...
}

我想创建我会调用的函数

DoSomething<Boo<int>>(x);
DoSomething<Foo<float>>(x);

我尝试过这样的事情

<template typename T>
<template typename U>
void DoSomething(T<U>& x)

但它不编译。如何为这种功能制作模板?

谢谢

4

4 回答 4

4

做就是了:

template <typename T>
struct Foo
{ 
};

template <typename T>
struct Boo
{ 
};

template <typename T>
void DoSomething(T& x)  // One parameter is enough, compiler will deduce types automatically
{
}    

Boo<int> x;
Foo<float> y;

DoSomething(x);   // compiler will generate void DoSomething(Boo<int>& x) 
DoSomething(y);   // compiler will generate void DoSomething(Foo<float>& x)

您的模板声明错误,

<template typename T> // invalid syntax

应该:

template <typename T>
于 2013-09-13T10:13:41.857 回答
3

如果要指定两种类型,则需要使用模板模板参数:

template <template<typename> class T, typename U>
void DoSomething(T<U>& x)

但是根据您想要实现的目标,如果您不需要在函数中同时使用这两种类型,只需使用单个模板参数即可:

template <typename Y>
void DoSomething(T& x)
于 2013-09-13T10:10:59.657 回答
0
<template typename T>
void DoSomething(T& x)
{
// do something
}
于 2013-09-13T10:12:03.070 回答
0

你有两个选择。为了示例,请考虑您的Foo模板结构和此声明:

Foo<double> v;

你的第一选择是

template <typename T>
void DoSomething1(T& x) { /* ... */ }
// ...
DoSomething1(v);

我坚信这是您所需要的。

但是,情况可能并非如此。T<U>也许,您确实需要在T模板类和类型的表单类型上调用该函数U。例如,您可能希望在函数体内T使用int(即 create )进行实例化。T<int> y;那么,你的第二个选择是

template <template <typename> class T, typename U>
void DoSomething2(T<U>& x) { T<int> y; /* ... */ }
// ...
DoSomething2(v);

不幸的是,这可能还不够!如果你试试,

std::vector<double> w;
// ...
DoSomething2(w);

最后一行无法编译。原因是std::vector模板类接受两个类型参数,并且DoSomething2期望模板类只接受一个。(当然可以std::vector只用一个参数进行实例化,因为第二个参数有默认值。)解决方案是使用 C++11 可变参数模板模板参数:

template <template <typename, typename...> class T, typename U>
void DoSomething3(T<U>&) { T<int> y; /* ... */ }
// ...
DoSomething3(v);
DoSomething3(w);
于 2013-09-13T10:22:05.593 回答