从 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::optionalstd::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::optionalstd::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 作为参数

C语言的泛型编程

如何在流中定义具有指定类型的所有可选字段的泛型类型

具有高阶函数的泛型

返回类型为协议的泛型函数与参数和返回类型为协议的非泛型函数的区别

是否可以在 TypeScript 中传播独特的泛型类型?