0

boostと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[] )
{
}
4

1 に答える 1

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>
{

実装者レベルでタイプを指定できる場合、これは機能するはずです。しかし、それは単一のインターフェースをインターフェースのファミリーに変えます。もっと良い方法があるかどうか見てみましょう。

于 2012-12-15T05:52:57.863 に答える