除了针对define的常规参数外,您将如何使用Macros编写此函数?
template <typename IterType>
typename IterType::value_type Sum(
const IterType& begin,
const IterType& end,
const IterType::value_type& initialValue)
{
typename IterType::value_type result = initialValue;
for (IterType i = begin; i != end; ++i)
result += i;
return result;
}
....
vector<int> values;
int sum = Sum(values.begin(), values.end(), 0);
这显然是一个简单的例子,但是该函数可以对实现加法*的任何类型的正向可迭代序列求和。这样使用的Typedef是泛型编程的重要元素。
*我只是在这里写的,我留给读者练习:-)
编辑:
这个答案似乎很容易引起混淆,所以让我多画一点。如果要查看STL向量的定义,您将看到类似于以下内容:
template <typename ValueType, typename AllocatorType>
class vector
{
public:
typedef ValueType value_type;
...
}
在标准容器中使用typedef可以使泛型函数(如我上面创建的函数)引用这些类型。函数“求和”以容器(std::vector<int>
)的类型为模板,而不是以容器(int
)内的类型为模板。没有typedef,就不可能引用该内部类型。
因此,typedef是Modern C ++的核心,而使用Macros则不可能。