是否可以使用成员枚举来专门化模板?

发布于 2024-10-09 17:07:32 字数 365 浏览 5 评论 0原文

struct Bar {
  enum { Special = 4 };
};

template<class T, int K> struct Foo {};
template<class T> struct Foo<T,T::Special> {};

用法:

Foo<Bar> aa;

使用 gcc 4.1.2 编译失败 它抱怨使用 T::Special 来对 Foo 进行部分专业化。如果 Special 是一个类,那么解决方案就是在它前面加上一个类型名。对于枚举(或整数)有等价的东西吗?

struct Bar {
  enum { Special = 4 };
};

template<class T, int K> struct Foo {};
template<class T> struct Foo<T,T::Special> {};

Usage:

Foo<Bar> aa;

fails to compile using gcc 4.1.2
It complains about the usage of T::Special for partial specilization of Foo. If Special was a class the solution would be to a typename in front of it. Is there something equivalent to it for enums (or integers)?

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

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

发布评论

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

评论(2

迟月 2024-10-16 17:07:32

由于 C++ 不允许这样做,正如 Prasoon 所解释的那样,因此替代解决方案是使用 EnumToType 类模板,

struct Bar {
  enum { Special = 4 };
};

template<int e>
struct EnumToType
{
  static const int value = e;
};

template<class T, class K> //note I changed from "int K" to "class K"
struct Foo
{};

template<class T> 
struct Foo<T, EnumToType<(int)T::Special> > 
{
   static const int enumValue = T::Special;
};

示例代码位于 ideone : http:// www.ideone.com/JPvZy


或者,您可以像这样简单地专业化(如果它解决了您的问题),

template<class T> struct Foo<T,Bar::Special> {};

//usage
Foo<Bar, Bar::Special> f;

Since that is not allowed by C++ as explained by Prasoon, so an alternative solution would be to use EnumToType class template,

struct Bar {
  enum { Special = 4 };
};

template<int e>
struct EnumToType
{
  static const int value = e;
};

template<class T, class K> //note I changed from "int K" to "class K"
struct Foo
{};

template<class T> 
struct Foo<T, EnumToType<(int)T::Special> > 
{
   static const int enumValue = T::Special;
};

Sample code at ideone : http://www.ideone.com/JPvZy


Or, you can simply specialize like this (if it solves your problem),

template<class T> struct Foo<T,Bar::Special> {};

//usage
Foo<Bar, Bar::Special> f;
夜血缘 2024-10-16 17:07:32

非类型模板参数的类型不能依赖于部分特化的模板参数。

ISO C++03 14.5.4/9 说

部分特化的非类型参数表达式不应涉及部分特化的模板参数,除非参数表达式是简单标识符。

template <int I, int J> struct A {};
template <int I> struct A<I+5, I*2> {}; //error
template <int I, int J> struct B {};
template <int I> struct B<I, I> {};     //OK

所以这样的东西是非法的 template结构 Foo{}; 因为 T::Special 依赖于 T

的用法也是非法的。您已提供一个模板参数,但需要提供两个。

The type of a non-type template argument cannot depend on a template parameter of a partial specialization.

ISO C++03 14.5.4/9 says

A partially specialized non-type argument expression shall not involve a template parameter of the partial specialization except when the argument expression is a simple identifier.

template <int I, int J> struct A {};
template <int I> struct A<I+5, I*2> {}; //error
template <int I, int J> struct B {};
template <int I> struct B<I, I> {};     //OK

So something like this is illegal template<class T> struct Foo<T,T::Special> {}; because T::Special depends on T

The usage is also illegal. You have provided one template argument but you need to provide two.

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