模板嵌套类模板类作为与完全专业函数的参数
Template nested class of template class as parameter to fully specialized function
我构建了一个自定义的模板迭代器作为模板的嵌套类:
template< typename T, class U, typename V >
class aContainer {
public:
template< bool ABool, bool BBool >
class aIterator {
public:
using iterator_category = std::forward_iterator_tag;
using value_type = T;
using difference_type = std::ptrdiff_t;
using referenc = T&;
using pointer = T*;
/** iterator related operations */
};
protected:
T const * const _begin;
T const * const _end;
public:
explicit aContainer( T const * const begin, std::size_t count ):
__begin{ begin }, __end{ __begin + count } { }
auto begin_a() const { return aIterator< true, false >{ __begin }; }
auto end_a() const { return aIterator< true, false >{ __end }; }
auto begin_b() const { return aIterator< false, true >{ __begin }; }
auto end_b() const { return aIterator< false, true >{ __end }; }
};
要匹配现有库的样式,我想将迭代器的引用传递到一个全专业的模板函数:
template< typename T, template< class > class U >
T max( T* data );
template<>
int max< int, aU >( int* data ) {
return old_c_style_max_int( data, aU< T >::size );
}
template<>
float max< float, bU >( float* data ) {
return old_c_style_max_float( data, bU< T >::size );
}
也许看起来有些怪异,但是这会阴影不同的旧-C式函数都很好地调用。
U类是辅助结构,创建特定的上下文(或风味(。容器及其迭代器需要该上下文。
template< typename T >
class aU {
using constexpr std::size_t size = 10;
using value_t = T;
/** ... */
};
template< typename T >
class bU {
using constexpr std::size_t size = 20;
using value_t = T;
/** ... */
};
我想实现的目标是将迭代器传递到函数中,作为这样的参数:
/* ... */
aContainer< int, aClass, bool > container( start );
auto iterator = container.begin_a();
for( ; iterator != container.end_a(); ++iterator ) {
foo< int, aClass >( iterator );
}
/* ... */
这甚至可能吗?我的猜测被编译器拒绝:/我认为,包装器结构可能是一个可能的解决方案,但我想避免使用。也是迭代基类,阴影模板迭代类似乎是可行的,但从概念的角度来看。
您可以将其他类型参数添加到foo
:
template<typename T, class U, typename Itr> void foo(Itr itr);
如果您想强调T
,U
和迭代器是通过aContainer
耦合的...好吧,您仍然需要一个额外的参数...一些额外的参数:
template<typename T, class U, bool flag, bool a, bool b> void foo(typename aContainer<T, U, flag>::template aIterator<a, b> itr);
但是,这一次您需要提供有关外部类型的完整信息,换句话说,也提供flag
(迭代器自己的参数a
和b
将被推导(:
foo<int, aClass, true>( iterator );
相关文章:
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 当从函数参数中的临时值调用复制构造函数时
- 如何从"decltype()"获取函数参数的数量<funtion>?
- 如何将lambda作为模板类的成员函数参数
- 模板参数推导失败,函数参数/参数不匹配
- 如何在C++中将迭代器作为函数参数传递
- 将函数参数"const char*"转换为"std::string_view"是
- C++ 如何将数组值解压缩为函数参数
- 主函数参数的属性
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 如何定义在用作函数参数时工作的类模板的转换
- 将函数参数完美转发到函数指针:按值传递呢?
- 为什么我不能将引用作为 std::async 的函数参数传递
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 是否可以就地构造一个固定大小的数组作为函数参数?
- 接受模板作为函数参数
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- Arduino 函数参数