gpt4 book ai didi

c++ - 模板参数困境

转载 作者:太空狗 更新时间:2023-10-29 20:48:57 25 4
gpt4 key购买 nike

我有一个难题。假设我有一个模板类:

template <typename ValueT>
class Array
{
public:
typedef ValueT ValueType;
ValueType& GetValue()
{
...
}
};

现在我想定义一个函数来接收对类的引用并调用函数 GetValue()。我通常会考虑以下两种方式:

方法一:

template <typename ValueType>
void DoGetValue(Array<ValueType>& arr)
{
ValueType value = arr.GetValue();
...
}

方法二:

template <typename ArrayType>
void DoGetValue(ArrayType& arr)
{
typename ArrayType::ValueType value = arr.GetValue();
...
}

这两种方式几乎没有区别。即使调用这两个函数看起来也完全一样:

int main()
{
Array<int> arr;
DoGetValue(arr);
}

现在,两者中哪一个是最好的?我能想到一些利弊:

方法 1 的优点:

参数是一个真正的类而不是模板,所以用户更容易理解接口(interface)——很明确的是参数必须是Array。在方法 2 中,您只能从名称中猜出它。我们在函数中使用 ValueType,这样比隐藏在 Array 中并且必须使用范围运算符访问时更清晰。

此外,typename 关键字可能会让许多不懂模板的程序员感到困惑。

方法 2 的优点:

这个函数更符合它的目的。当我想如果是的话,我真的不需要这个类是数组。我真正需要的是一个具有方法 GetValue 和类型 ValueType 的类。就这样。也就是说,这种方法更通用。

该方法也较少依赖于Array类的变化。如果更改了 Array 的模板参数怎么办?为什么它会影响 DoGetValue?它并不关心 Array 是如何定义的。

每次遇到这种情况我都不知道该选择什么。你的选择是什么?

最佳答案

第二个更好。在第一个的“优点”中,您说,“参数必须是 Array 是非常明确的”。但是说参数必须是一个数组是一个不必要的限制。在第二个示例中,任何具有合适的 GetValue 函数的类都可以。由于这是不必要的限制,因此最好将其删除(第二个)而不是使其明确(第一个)。您将编写更灵活的模板,这在您希望从非数组的对象中获取值时很有用。

关于c++ - 模板参数困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2081175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com