对于结构
<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)
但它没有编译。如何为这种功能制作模板?
由于
答案 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);