使用“模板化模板”显式调用/实例化函数;

发布于 2024-10-30 15:02:38 字数 1160 浏览 0 评论 0 原文

以下代码工作正常:

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(); 这样的简单答案是不可能的。 我正在为 C++ 代码编写一个文本解析器。无论解析器在哪里找到,

x = (Type) y; 

它都应该转换为,

x = Extract<Type> (y);

现在,类型可以是

  1. 任何普通类型,例如 int*A**
  2. 一些模板化模板,例如 Wrap A>

现在,Extract() 对于这两种情况的工作方式有所不同。我必须弄清楚使用模板,无论是 Extract 还是 Extract >

==>用更简单的语言来说,可以调用该方法:

  1. Extract()
  2. Extract; >()

我可以判断它是否在第一种情况下被调用,但是我如何判断它是否在第二种情况下被调用? (前提是,我也想知道内部类型)。

Following code works fine:

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);
}

But, I am passing a pointer argument to extract the outer type and inner type.

Is there any better way by which I can invoke the method with explicit template instantiation ?
Extract<Wrap<int> > ();

Edit:

I will detail my question a bit more. This explains, why the easy answer like Extract<Wrap, int>(); is not possible.
I am writing a text parser, for C++ code. Wherever, parser finds,

x = (Type) y; 

it should convert into,

x = Extract<Type> (y);

Now, the Type can be

  1. any normal type like, int* or A**
  2. some templatized template like Wrap<A>

Now, Extract() works different for both the cases. I have to figure out using template that, whether it's Extract<int*> or Extract<Wrap<int> >.

==> In simpler language, the method can be called:

  1. Extract<int*>()
  2. Extract<Wrap<int> >()

I can figure out if it's called in 1st case, but how can I figure out if it's called in 2nd case ? (provided that, I want to know internal type also).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

雨落□心尘 2024-11-06 15:02:38

Extract 怎么样? (&obj);

但为什么要明确指定它呢?大多数时候,为了简单起见,您宁愿让编译器自动为您推断类型。

编辑:您是否考虑过专门从事 Wrap

#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* 的专业化。

How about Extract<Wrap, int> (&obj);?

But why do you want to specify it explicitly? Most of the time you'd rather have the compiler deduce the types for you automatically for simplicity.

EDIT: Have you considered just specializing for 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 ();
}

If needed you can add a specialization for T* as well.

风筝在阴天搁浅。 2024-11-06 15:02:38

这很好用

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++ 模板 - 完整指南一书。

This works fine

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>();
}

You certainly lack basic understanding of C++ templates. Read the book C++ Templates - The Complete Guide.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文