从枚举器获取枚举类型

时间:2016-08-04 16:06:08

标签: c++ templates enums

假设我有这样的代码:

#include <cstdio>

enum Foo { Foo_A, Foo_B };
enum Bar { Bar_A, Bar_B };

template<typename enumeration, int enumerator>
struct tpl;

template<int enumerator>
struct tpl<Foo, enumerator>
{
    tpl() { printf("Foo: %d\n", enumerator); }
};

template<int enumerator>
struct tpl<Bar, enumerator>
{
    tpl() { printf("Bar: %d\n", enumerator); }
};

int main()
{
    tpl<Foo, Foo_A> foo_a;
    tpl<Foo, Foo_B> foo_b;
    tpl<Bar, Bar_A> bar_a;
    tpl<Bar, Bar_B> bar_b;
    return 0;
};

有没有办法减少&#34;重复&#34;在使用现场?即我不能推断出枚举类型&#34; Foo&#34;来自调查员&#34; Foo_A&#34;等等以某种方式在上面的模板代码中使用它? enum课会帮助吗?

1 个答案:

答案 0 :(得分:2)

你的问题的答案是,没有目前还没有办法做到这一点。你所面对的被称为template <typename T, T t>成语。事实上,如果你谷歌它你会发现近75,000次点击,没有解决方法。你必须专心化。

但是有一些好消息即将来临。在过去十年中,这已经多次提交给标准委员会:

  • N3405建议允许template <typename T t>其中T是类型而t是值,只有一个值作为模板参数传递
  • N3601建议template <typename T, T t>是一个特殊情况,编译器只接受一个值作为模板参数,从中推导出Tt
  • N4469建议允许关键字auto指定元参数:template <auto t>,以便可以将值作为模板参数t传递,并推导出类型< / LI>

5月4日在Lenexa召开的15日会议上,N4469最终获得了鼓励,并在标准委员会会议上获得了修改要求:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4539.html#9

第一个修订版P0127R0于2015年9月25日提交。

在2016年3月4日提交了一份后续修订:P0127R1提议对概念工作草案部分进行编辑。

P0127R2专注于完全指定工作草案的非概念部分中的习语变化,因为不清楚概念是否将包含在C ++ 17中。该修订于16年6月23日在C ++ 17标准中被接受:http://developerblog.redhat.com/2016/07/13/red-hat-iso-c-standards-meeting-june-2016-core-language/

所以随着C ++ 17的到来,你将能够处理template <typename T, T t>成语并使用:

template <auto t>
struct tpl{
    tpl(){ cout << typeid(decltype(t)).name() << ": " << t << endl; }
};