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);
但是这一次,您需要向编译器提供关于外部类型的完整信息,换句话说,也提供标志
(将推导迭代器自己的参数A
和B
):
foo<int, aClass, true>( iterator );
还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案
我有一个模板基类,其模板参数类型为bool。此基类的构造函数参数列表取决于模板参数是true还是false。我想从这个类派生另一个模板类,它的模板参数是任意类型的。我需要这个派生类根据该类型的特征调用该基类的正确构造函数。 下面的例子并不包罗万象。无论是否为整数,基类模板bool可以是任何类型trait。此外,传递给派生类的模板参数的类型可以是任何类型。
关于下一个代码,我有一些问题: > 类专业化
我试图编写一个可变函数模板来计算的字节大小。这将用于一个网络编程项目,我正在工作。第一步,我在没有工作的variadic模板的情况下想出了这个: 错误代码#2。如果我将variadic模板放在不同的位置: 我得到了 错误:重载的'size t ()'调用不明确
在本文中,他们说(c)是(b)的显式专门化。我的疑问是,为什么我们不能说它是(a)的显式专门化?因为我们可以为任何特定类型专门化模板。所以,当专门化int*时,为什么他们说(c)显式专门化(b)。 任何评论都将有助于理解事情。
我想用两种模板类型编写一个模板化函数:一种是bool,另一种是typename,我想专门研究typename。 这就是我想要的,但只针对T的几种类型: 没有bool在那里,我可以做这样的事情: 我搞不懂这句话的语法,而专门化方面的微软文档只涉及单一类型的情况。