从 C++ 中的泛型函数返回可选的
Posted
技术标签:
【中文标题】从 C++ 中的泛型函数返回可选的【英文标题】:return optional from generic function in c++ 【发布时间】:2017-02-03 04:38:59 【问题描述】:不使用optional<T> from BOOST library
在c++中返回泛型可选的另一种方法是什么
示例
template<class T>
T search(T arg)
// this function is just to show the idea of what I am trying to ac
if (found) return arg;
return ?<---
我的意思是,如果我知道最常见的调用这个函数的类型,我可以
返回 T(-1); 为 int
return T("not found"); for string
return nullprt;为指针类型
但这违背了泛型的目的。一定有别的方法吧? 感谢您的帮助
【问题讨论】:
现有设施怎么可能知道每种类型的良好默认值? 你指的是三个返回的例子吗? 是的,这听起来像你想要的,但一般。 是的,先生,我什至想将这些返回值放在某个字典中,然后检测哪个类型传入了该特定键的返回值 然而你不可能对每种类型都这样做。我在您的通用代码之后编写了自己的类型。它怎么会知道如何构造我的类型的对象,更不用说构造一个合理的返回对象了? 【参考方案1】:首先,boost::optional
或 std::optional
正是针对这种情况而设计的。你有什么不想使用它们的理由吗?因为大多数解决方案要么模仿std::optional
,要么就是一个糟糕的替代品。
通过引用传递一个输出参数。
template <class T>
bool search( T arg, T & out );
返回是否已将结果写入输出。这可能是一个糟糕的替代品,因为它需要调用者构造一个T
类型的对象。如果调用者本身是通用的,那么T
要么必须是默认可构造的,要么传递给调用者本身。
如果您通常会返回引用,请改为返回指针。
template <class T>
const T & search( T arg );
可以替换为
template <class T>
const T * search( T arg );
请注意,std::optional
不支持与boost::optional
相同程度的引用,因此在使用std::optional
时,您在处理引用时可能真的会退回到这一点。
自己写一个可选的。
我不会推荐这个。如果你想把它做好,你必须花很多心思。如果你能忍受boost::optional
或std::optional
的限制(特别是关于线程安全),我看不出你应该这样做的理由。
具有提供虚拟值的类型特征。
再次阅读您的问题,您考虑在地图中保留虚拟值。我不会推荐这个,因为很明显,它不那么通用,而且我看不到任何好处。但是关于地图,您将拥有一个提供虚拟值的类型特征:
template <class T>
struct DummyValue;
template <>
struct DummyValue<int>
static constexpr const int value = -1;
// Or:
// static int makeDummyValue();
;
// And so on ...
【讨论】:
你是对的...可选库它是大声笑...感谢您的解释...他们需要用 std::optional man 发布 c++以上是关于从 C++ 中的泛型函数返回可选的的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 在具有可选参数的泛型函数中以 Nil 作为参数