我们假设我有以下课程模板:
<> - 作为模板阅读
template<template<class T> class Policy>
struct
{
};
如何(不向此&lt;&gt;添加额外的参数)我可以将策略类型暴露给外部世界吗? typedef不起作用,为什么我不能写这样的东西:
typedef Policy<T> Policy;
为什么我不能使用&lt;&lt;&lt;&lt; PARAM&GT;&GT ;?这种T型无法进入吗?
答案 0 :(得分:1)
T类型未定义。当您采用模板模板类型时,编译器需要一个不完整类型,该类型可以使用其他类型参数进行实例化。它不用于提取类型。
template<template<typename T> class X> void func() {
};
func<std::shared_ptr>(); // correct usage
func<std::shared_ptr<int>>(); // fail
答案 1 :(得分:1)
我知道C ++ 0x可以实现,但我不知道语法。与此同时,C ++ 03中最接近的是
template <template <typename> Pol>
struct Foo
{
template <typename T>
struct policy
{
typedef Pol<T> type;
};
};
用法:typename Foo<F>::template policy<T>::type
您想要写Foo::policy<T>
。
答案 2 :(得分:0)
正如DeadMG所说,模板模板类型不完整。例如,不完整类型std :: vector匹配template< template<class, class> class TypeWithTwoParams>
为了推断示例中T的实际类型,可以为函数提供一个参数(具有“完整类型”)。例如,在下面的代码中,我们可以推导出T,因为我们将arg作为PolicyRelatedFunction的参数传递,并且它具有允许编译器进行必要推导的完整类型。
我觉得这是你要做的事情,除了功能而不是结构。 typeid的东西只是为了说明我们可以使用T.这将打印出“T = std :: string”
template< template<class > class Policy, typename T>
void PolicyRelatedFunction(Policy<T>& arg)
{
if (typeid(T) == typeid(int) )
std::cout << "T = int";
else if (typeid(T) == typeid(std::string) )
std::cout << "T = std::string";
}
TemplatedType<std::string> arg;
PolicyRelatedFunction<TemplatedType>(arg);
// PolicyRelatedFunction(arg) works as well - compiler can figure it out.