【问题标题】:Factory Function taking an Enum argument采用 Enum 参数的工厂函数
【发布时间】:2012-10-08 11:43:31
【问题描述】:

如何避免并非所有控制路径都在此处返回容器的事实:

        enum Type {Int, String};

        Container containerFactory(Type type)
        {
            switch(type)
            {
            case Int:
                return Container (std::vector<int>());
            case String: 
                return Container (std::vector<std::string>());
            }
        }

更新: 我在想我可以在这里抛出一个异常,但我不能对此进行单元测试,因为不可能将无效的类型传递给函数。

【问题讨论】:

  • 返回一个空容器?也许某种特殊版本表明存在错误/无结果?如果没有Container 的声明,这有点难以分辨。
  • 我总是会返回一个 *container 或 null,但也许这只是我:(
  • 旁注:您不需要双括号或break 语句。
  • @Martin James 然后我需要更改很多代码以使用 boost::shared_ptr 而不是 Container 和 Container&。
  • @MarceloCantos - 也许一些代码完成已经把它们放进去。

标签: c++


【解决方案1】:

我倾向于在底部添加assert()

Container containerFactory(Type type)
{
    // ...
    assert( !"Unreachable code hit!" );
    return Container();
}

【讨论】:

  • 不需要单元测试;函数签名明确指出只有两个值是可能的(IntString),所以这些是您需要测试的函数。
【解决方案2】:

显然,传递一个无效值是一个编程错误。在“我的世界”/rulebook/whatever 中,编程错误会导致断言失败,而不是异常。

编辑:出于这个原因,我实际上至少有两个主要的断言语句:一个在发布版本中被删除,另一个没有。大多数最终会留在代码中,以防触发错误,但有时断言成本太高,不值得在发布版本中使用。

如果您的编译器无法将断言识别为“不会返回的东西”,您可以返回任何您想要关闭它的东西。无论如何都没有“好的回报”,除非你想在调用接口中添加错误检查,因为你不知道调用者期望从他的“759843682”未初始化请求中得到什么类型的容器:-)

【讨论】:

  • This answer 解释说,std::logic_error 用于表示程序员也搞砸了的情况。
  • 是的,你的权利。我在想这个异常至少会摆脱编译器错误但是 assert( !"Unreachable code hit!" );其次是返回容器();更有意义!
【解决方案3】:

要么throw,默认返回Enum类型之一,要么返回null_ptr

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 2019-08-23
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    相关资源
    最近更新 更多