C++ boost 模板参数特征

发布于 2024-09-08 16:04:07 字数 252 浏览 8 评论 0原文

我相信我在boost中见过恢复模板模板参数的宏,例如:

template<class>
struct parameters;

#define parameters(T) template<class A> \
          struct parameters<T<A> > { typedef A type1; };

有这样的宏吗,还是我错了?

谢谢

I believe I had seen macro in boost that recovers template template parameters, for example:

template<class>
struct parameters;

#define parameters(T) template<class A> \
          struct parameters<T<A> > { typedef A type1; };

is there one like this, or am I wrong?

Thank you

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

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

发布评论

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

评论(2

相对绾红妆 2024-09-15 16:04:07

C++0x 中的 delctype 支持使得实现起来相当简单:(

template<template <typename> class Parent, typename Param1>
Param1 get_type(Parent<Param1> const &input) { return Param1(); }

SomeTpl<int> some_obj;
delctype(get_type(some_obj)) x;

尽管您需要为具有 2、3、4 等参数的模板单独定义 get_type。)

不幸的是,我认为没有是一种无需 decltype 即可实现此目的的方法,因为这样做需要自动执行函数模板提供的类型推导(这不适用于类模板),因此无法以这种方式创建 typedef。

我不知道 boost 是否已经有类似的东西,但如果他们这样做,它仍然需要你的编译器支持 decltype,但由于 decltype 太新了,所以没有太多东西在 boost 中还使用它(尽管有一些)。

delctype support in C++0x makes this fairly trivial to implement:

template<template <typename> class Parent, typename Param1>
Param1 get_type(Parent<Param1> const &input) { return Param1(); }

SomeTpl<int> some_obj;
delctype(get_type(some_obj)) x;

(Though you need a separate get_type definition for templates with 2, 3, 4, etc parameters.)

Unfortunately, I don't think there is a way to do this without decltype, because to do so required automatic the type-deduction provided by function templates (which is not available for class templates) and so there's no way to make a typedef that way.

I don't know off-hand if boost has anything like this already, but if they do it will still require your compiler to support decltype, but since decltype is so new there is not a lot of stuff in boost that uses it yet (though there is some).

无语# 2024-09-15 16:04:07

我已经学会相信约翰内斯的陈述,所以我有点困惑,因为这似乎用 VC10 对我来说编译好并打印预期的 int

#include <iostream>
#include <typeinfo>

template< class T >
class steal_it;

template< typename U, template<typename> class C >
struct steal_it< C<U> > { 
    typedef U result_t;
};

template< typename T >
class foo {};

template< typename T >
void test_it(T)
{
    typename steal_it<T>::result_t bar = 42;
    std::cout << typeid(bar).name() << '\n';
}

int main(){

    test_it( foo<int>() );

    return 0;
}

当然,因为我没有检查任何其他编译器,这可能只是 VC 再次愚弄我......

I have learned to trust Johannes' statements, so I'm a bit confused, since this seems to compile Ok for me with VC10 and prints the expected int:

#include <iostream>
#include <typeinfo>

template< class T >
class steal_it;

template< typename U, template<typename> class C >
struct steal_it< C<U> > { 
    typedef U result_t;
};

template< typename T >
class foo {};

template< typename T >
void test_it(T)
{
    typename steal_it<T>::result_t bar = 42;
    std::cout << typeid(bar).name() << '\n';
}

int main(){

    test_it( foo<int>() );

    return 0;
}

Of course, since I didn't check with any other compilers, this could just be VC fooling me again...

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