C ++ - typedef“inside”模板参数?

时间:2010-03-29 01:39:21

标签: c++ templates typedef

想象一下,我有一个这样的模板函数:

template<typename Iterator>
void myfunc(Iterator a, typename Iterator::value_type b)
{ ... }

有没有办法通过声明我可以在函数签名中使用的Iterator :: valuetype的typedef来实现相同的东西?例如,我更愿意做这样的事情:

template<
    typename Iterator,
    typedef Iterator::value_type type>
void myfunc(Iterator a, type b)
{ ... }

到目前为止,我已经使用默认模板参数和Boost概念检查来确保始终使用默认值:

template<
    typename Iterator,
    typename type = typename Iterator::value_type >
void myfunc(Iterator a, type b)
{
     BOOST_STATIC_ASSERT((
         boost::is_same<
             typename Iterator::value_type, 
             type
         >::value
     ));
     ...
}

...但如果语言中有这种类型的支持会很好。

修改

我可能应该使用类而不是函数,因为默认参数不是函数的标准。

template<
    typename T,
    typename V = typename T::value_type>
class A : public B<T, V>  
{
    BOOST_STATIC_ASSERT((boost::is_same<typename T::value_Type, V>::type));
};

2 个答案:

答案 0 :(得分:2)

您可以在参数列表中使用typename

template <typename Iterator>
void myfunc(Iterator a, typename Iterator::value_type b)
{ 
}

答案 1 :(得分:2)

您正在寻找在模板化函数定义中使用的模板化typedef。我认为你不能这样做......

你可以使用带有静态函数的模板类&amp; typedef ...但使用它会变得丑陋:

template<typename Iterator>
class arbitraryname
{
public:
  typedef typename Iterator::value_type  value;

  static void myfunc( Iterator a, value b )
  {
    value c = b;
    cout << "Test" << c << endl;    
  }
};

struct Foo
{
  typedef int value_type;
};

int main()
{
  Foo f;
  myfunc<Foo>(f,2); // Old way.
  arbitraryname<Foo>::myfunc(f,3); // With templated class.
}

就个人而言,在这种情况下,我会选择 #define ......

#define VALUE_TYPE  typename Iterator::value_type
template<typename Iterator>
void myfunc(Iterator a, VALUE_TYPE b)
#undef VALUE_TYPE
{
  typedef typename Iterator::value_type  bar;
  bar z = b;
  cout << "Test" << z << endl;
}

当然 #define 是丑陋而有罪的。但是代码读起来也很痛苦......

P.S。为了安全起见,您可能需要添加:

#ifdef  VALUE_TYPE
#error "VALUE_TYPE already defined!"
#endif