C++ 采用枚举参数的工厂函数

C++ 采用枚举参数的工厂函数,c++,C++,如何避免并非所有控制路径都返回容器: enum Type {Int, String}; Container containerFactory(Type type) { switch(type) { case Int: return Container (std::vector<int>()); case St

如何避免并非所有控制路径都返回容器:

        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>());
            }
        }
enum类型{Int,String};
集装箱工厂(类型)
{
开关(类型)
{
案例Int:
返回容器(std::vector());
大小写字符串:
返回容器(std::vector());
}
}
更新:
我想我可以在这里抛出一个异常,但我不能对此进行单元测试,因为不可能将无效类型传递给函数。

或者
抛出
,默认返回一个
枚举
类型,或者返回一个
空ptr

或者
抛出
,默认情况下,返回一个
Enum
类型或返回一个
null\u ptr
显然,传递无效值是编程错误。在“我的世界”/《规则手册》/无论如何,编程错误会导致断言失败,而不是异常

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


如果您的编译器不将断言识别为“无法返回的内容”,则可以返回您想要关闭它的任何内容。除非您想在调用接口中添加错误检查,否则不会有“良好的返回”,因为您不知道调用方希望从其“759843682”未初始化请求中获得什么类型的容器:-)

显然,传递无效值是编程错误。在“我的世界”/《规则手册》/无论如何,编程错误会导致断言失败,而不是异常

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


如果您的编译器不将断言识别为“无法返回的内容”,则可以返回您想要关闭它的任何内容。除非您想在调用接口中添加错误检查,否则不会有“良好的返回”,因为您不知道调用方希望从其“759843682”未初始化请求中获得什么类型的容器:-)

我倾向于在底部添加一个
断言()

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

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

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

归还一个空容器?可能是某种特殊版本,表明出现了错误/没有结果?如果没有
Container
的声明,就有点难说了。我总是会返回*Container或null,但可能那只是我:(旁注:您不需要双括号或
break
语句。@Martin James我将需要更改大量代码以使用boost::shared_ptr而不是Container和Container&.@Marcelocontos-可能是一些代码完成操作将它们放入了。返回一个空容器?可能是某种专门的版本,用于Cate表示有错误/没有结果?如果没有
容器的声明
就有点难以判断。我总是会返回*Container或null,但可能只有我:(旁注:您不需要双括号或
break
语句。@Martin James I随后需要更改大量代码,以使用boost::shared_ptr而不是Container和Container&@Marcelocontos-可能是一些代码补全将它们放进去了。解释了
std::logic_error
用于表示程序员也搞砸了。是的,你说得对。我在想,异常至少可以消除编译器错误,但断言(!“无法访问的代码命中!”),然后是返回容器()“;更有意义!解释说,
std::logic_error
也用于表示程序员出错的情况。是的,你说得对。我想异常至少可以消除编译器错误,但断言(!“Unreachable code hit!”),然后是返回容器();更有意义!它不需要进行单元测试;函数签名清楚地说明只有两个值是可能的(
Int
String
),因此这些是需要测试的函数。它不需要进行单元测试;函数签名清楚地说明只有两个值是可能的(
Int
String
),因此这些是您需要测试的函数。