假设我有这样的代码:
#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课会帮助吗?
答案 0 :(得分:2)
你的问题的答案是,没有目前还没有办法做到这一点。你所面对的被称为template <typename T, T t>
成语。事实上,如果你谷歌它你会发现近75,000次点击,没有解决方法。你必须专心化。
但是有一些好消息即将来临。在过去十年中,这已经多次提交给标准委员会:
template <typename T t>
其中T
是类型而t
是值,只有一个值作为模板参数传递template <typename T, T t>
是一个特殊情况,编译器只接受一个值作为模板参数,从中推导出T
和t
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; }
};