如何概括一个接口以要求某个元组的返回值?

Posted

技术标签:

【中文标题】如何概括一个接口以要求某个元组的返回值?【英文标题】:how to generalize an interface to require a return value of some tuple? 【发布时间】:2012-12-15 05:27:45 【问题描述】:

我正在使用对boost and std::tuple<> 有良好支持的 SOCI 库。

我的意图是定义一个名为SOCI_Streamable抽象接口,它需要一个返回一些元组的方法。

我让它适用于 gcc 4.7.2 中的特定元组,但我需要帮助抽象此接口以适用于任何元组

换句话说,我想把这个要求转换成代码:一个类满足SOCI_Streamable的要求,如果它可以返回某种std::tuple——我不在乎是什么类型。

只要满足要求,对以下代码进行重大更改即可。我怀疑某种模板代码甚至可能需要 CRTP,但我不确定。

#include<tuple>

// want to generalize next line to any std::tuple<>
typedef std::tuple<int const&,char const> some_tuple;    

class SOCI_Streamable

public:
  virtual some_tuple obj_as_tuple() const = 0; 
;

class Foo :
    public SOCI_Streamable

public:
  virtual some_tuple obj_as_tuple() const 
    
        return std::forward_as_tuple( m_int, m_char );
    
private:
    int   m_int;
    char  m_char;
;

int main( int argc, char* argv[] )


【问题讨论】:

你能在实现类级别指定类型吗? @KarthikT 当然,但问题仍然是在接口级别将它与一些抽象接口联系起来............如果你知道如何做到这一点,请发布答案 - ty 您希望能够将对象转换为 SOCI_Streamable 然后调用接口吗?我看不出你怎么能做到这一点,因为在编译时无法知道返回类型。或者你认为基类是 SOCI_Streamable 的一些模板实例化吗? 【参考方案1】:
template <class A,class B>
class SOCI_Streamable

public:
  typedef std::tuple<A,B> Tuple;
  virtual Tuple obj_as_tuple() const = 0; 
;

class Foo :
   public SOCI_Streamable<int const&,char const>

如果您可以在实施者级别指定类型,则应该可以。但这确实将单个接口变成了一系列接口..让我看看是否有更好的方法 .

【讨论】:

以上是关于如何概括一个接口以要求某个元组的返回值?的主要内容,如果未能解决你的问题,请参考以下文章

如何对返回 orm 对象和自定义列的元组的查询进行正确排序、分组?

在递归二叉树函数中返回元组时遇到问题

函数(上)

panda迭代

函数和过程

当元组是字典的值时仅检索元组的一个元素