如何为此功能创建模板?

时间:2013-09-13 10:08:40

标签: c++ templates

对于结构

<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 个答案:

答案 0 :(得分: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>

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:0)

<template typename T>
void DoSomething(T& x)
{
// do something
}

答案 3 :(得分:0)

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

Foo<double> v;

您的首选是

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

我坚信这就是你所需要的。

然而,情况可能并非如此。也许,您确实需要在T<U>形式的类型上调用该函数,其中T是模板类,U是一种类型。例如,您可能希望在函数体内使用T(即创建int)实例化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);