想象一下,我有一个这样的模板函数:
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));
};
答案 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