0

関数から任意の型を返したいです。戻り値の型は、多態的な関数呼び出しに動的に依存します。たとえば、次の例では、列数が異なる CSV ファイルから値を読み取ります。

struct File 
{
    virtual SOMETHING getTuple();
};

struct File1 : File
{
    SOMETHING getTuple()
    {   
        return std::tuple<int, double, string>();
    }    
};

struct File2 : File
{
    SOMETHING getTuple()
    {   
        return std::tuple<string, string>();
    }    
};

int main() 
{
    std::ifstream fs("file.csv");
      File2 f;
    BOOST_AUTO(tuple, f.getTuple())
    BOOST_AUTO(row, read(fs,tuple));
    BOOST_FOREACH(BOOST_TYPEOF(tuple) element , row )
    {
        for_each(element,print());
        std::cout << std::endl;
    }
};    

getTuple()呼び出されたオブジェクトに基づいて異なる型を返すように署名を作成するにはどうすればよいですか?

解決:

class File1
{
    std::ifstream ifs;
public:
    typedef boost::fusion::vector<int, double, std::string> tuple; 
    File1() : ifs("file1.csv") {}

    std::ifstream& getfs()
    {
        return ifs;
    }
};

class File2
{
    std::ifstream ifs;
public:
    typedef boost::fusion::vector<std::string, std::string> tuple; 
    File2() : ifs("file2.csv") {}

    std::ifstream& getfs()
    {
        return ifs;
    }
};

int main()
{
    File2 f;
    typedef File2::tuple tuple;

    BOOST_AUTO(x, read(f.getfs(),tuple()));
    BOOST_FOREACH(tuple e , x )
    {
        for_each(e,print());
        std::cout << std::endl;
    }
}
4

1 に答える 1

0

あなたはそれを達成することはできません。関数シグネチャはコンパイル時に決定する必要があるため、オブジェクトの動的な型に依存することはできません。

最も近い方法は、 CRTPを静的ポリモーフィズムに使用することです。つまり、次のようにします。

template<class Derived>
struct FileBase 
{
    typename Derived::TupleType getTuple()
    {
        return typename Derived::TupleType();
    }
};


struct File1 : FileBase<File1>
{
   typedef std::tuple<int, double, string> TupleType;
};

struct File2 : FileBase<File2>
{
    typedef std::tuple<string, string>() TupleType; 
};

これにより、指定された例で必要な動作が得られますが、ランタイム ポリモーフィズムでは機能しません。

于 2013-04-19T12:03:35.747 に答える