当前位置: 首页 > 知识库问答 >
问题:

模板类的模板嵌套类作为参数来完全专门化函数

黎震博
2023-03-14
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 );
}
/* ... */

共有1个答案

汪胡非
2023-03-14

您可以向foo添加另一个类型参数:

template<typename T, class U, typename Itr> void foo(Itr itr);

如果您想在TU和迭代器之间通过acontainer...嗯,您仍然需要一个额外的参数...几个额外的论点:

template<typename T, class U, bool flag, bool a, bool b> void foo(typename aContainer<T, U, flag>::template aIterator<a, b> itr);

但是这一次,您需要向编译器提供关于外部类型的完整信息,换句话说,也提供标志(将推导迭代器自己的参数AB):

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在那里,我可以做这样的事情: 我搞不懂这句话的语法,而专门化方面的微软文档只涉及单一类型的情况。