使用'模板化模板'显式调用/实例化函数

时间:2011-04-05 13:34:10

标签: c++ templates

以下代码正常运行:

template<typename T>
struct Wrap {};

template<template <class> class OUT, typename IN>
void Extract (OUT<IN> *obj)
{ /* only class 'IN' is used in some way */ }

int main ()
{
  Wrap<int> obj;
  Extract(&obj);
}

但是,我传递一个指针参数来提取外部类型和内部类型。

有没有更好的方法可以通过显式模板实例化来调用该方法? Extract<Wrap<int> > ();

编辑:

我会详细说明我的问题。这解释了为什么像Extract<Wrap, int>();这样简单的答案是不可能的。 我正在为C ++代码编写一个文本解析器。解析器在哪里找到,

x = (Type) y; 

它应该转换成,

x = Extract<Type> (y);

现在,Type可以是

  1. 任何普通类型,例如int*A**
  2. 一些模板化的模板,例如Wrap<A>
  3. 现在,Extract()对两种情况都有所不同。我必须弄清楚使用模板,无论是Extract<int*>还是Extract<Wrap<int> >

    ==&GT;用更简单的语言,可以调用该方法:

    1. Extract<int*>()
    2. Extract<Wrap<int> >()
    3. 我可以弄清楚它是否在第一种情况下被调用,但是如何判断它是否在第二种情况下被调用? (前提是,我也想知道内部类型)。

2 个答案:

答案 0 :(得分:0)

Extract<Wrap, int> (&obj);怎么样?

但是你为什么要明确指定呢?大多数情况下,为了简单起见,您宁愿让编译器为您自动推断出类型。

编辑:您是否考虑过专攻Wrap<U>

#include <iostream>

template<typename T>
struct Wrap {};

template <class T>
struct Foo
{
static void Extract()
{
    std::cout << "Base type" << std::endl;
    // Stuff
}
};

template <class U>
struct Foo<Wrap<U> >
{
static void Extract()
{
    std::cout << "Extract<Wrap<U> >" << std::endl;
    // Stuff for Wrap
}
};

int main ()
{
  Foo<int>::Extract();
  Foo<Wrap<int> >::Extract ();
}

如果需要,您也可以为T*添加专精。

答案 1 :(得分:0)

这很好用

template<typename T>
struct Wrap {};

template<template <class> class OUT, typename IN>
void Extract ()
{
    IN x; // IN => int
} 

int main ()
{
  Wrap<int> obj;
  Extract<Wrap, int>();
}

您当然缺乏对C ++模板的基本了解。阅读书籍C++ Templates - The Complete Guide

相关问题