如何公开模板模板arg

时间:2010-12-11 20:12:57

标签: c++ templates

我们假设我有以下课程模板:
<> - 作为模板阅读

template<template<class T> class Policy>
struct
{

};

如何(不向此&lt;&gt;添加额外的参数)我可以将策略类型暴露给外部世界吗? typedef不起作用,为什么我不能写这样的东西:

typedef Policy<T> Policy;

为什么我不能使用&lt;&lt;&lt;&lt; PARAM&GT;&GT ;?这种T型无法进入吗?

3 个答案:

答案 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.