假设我有一个只接受类型模板参数的函数,我无法更改它的定义/实现。
template < typename T >
void do_it();
现在我有一个以通常的方式定义的类型列表,也无法更改它:
template< typename ...Ts >
struct typelist;
我想实施一个function它接受一个类型列表,并对每种类型运行 do_it() :
template< typename List >
void do_them();
到目前为止我找到的唯一解决方案是:
template< typename T >
void do_them_impl()
{
do_it<T>();
}
template< typename T, typename Ts...>
void do_them_impl()
{
do_it<T>();
do_them_impl<Ts...>();
}
template< template < typename...> class List, typename ...Ts >
void do_them_extract( List<Ts...>&& )
{
do_them_impl< Ts >();
}
template< typename List >
void do_them()
{
do_them_impl( List{} );
}
但这需要 4(!) 个函数,对于我想创建一个的每种情况do_them
功能。我需要其中相当多的函数,并且我不想为每个函数编写四个函数。我错过了什么吗?
欢迎 C++14,也欢迎 C++17 解决方案,但如此标记。
在 C++14 中,您可以使用一些可怕的技巧来引入有效的包扩展上下文:
template< template < typename...> class List, typename ...Ts >
void do_them_impl( List<Ts...>&& )
{
(void)std::initializer_list<int> {
(do_it<Ts>(), 0)...
};
}
template< typename List >
void do_them()
{
do_them_impl( List{} );
}
这使您可以避免递归模板实例化,这通常更昂贵。
现场演示
在 C++17 中你可以使用折叠表达式:
template< template < typename...> class List, typename ...Ts >
void do_them_impl( List<Ts...>&& )
{
(do_it<Ts>(), ...);
}
template< typename List >
void do_them()
{
do_them_impl( List{} );
}
现场演示
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)