Возврат произвольных типов из функции

Я хотел бы вернуть произвольный тип из функции. Тип возвращаемого значения динамически зависит от вызова полиморфной функции. Например, следующий код считывает значения из файлов 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;
}
}

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;
};

Это дало бы поведение, которое вы хотели в данном примере, но оно не будет работать через полиморфизм во время выполнения.

0

Другие решения

Других решений пока нет …