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
),因此这些是您需要测试的函数。