Я пишу класс matrix
шаблона, который печатает как файл и std::cout
, то есть:функции шаблона для печати Thrust вектора
matrix<float> myMat;
...
myMat.cout(...) // print to std::cout
myMat.write("out.txt") // print to file
И разделит общую основную функцию печати, которую я пытаюсь реализовать как шаблон, так как я видел разные примеры, которые используют thrust::copy
для записи данных как в std::cout
, так и в файлы.
Ниже представлен скелет из того, что я сделал, но он в настоящее время выводит мусор. Может ли кто-нибудь указать на некоторые ошибки Возможно, я сделал? Например, разрешено ли мне проходить std::cout
?
template <typename data_T> matrix {
...
template <typename out_T> int printTo(out_T &out, ...) {
data_T *start = ..., *end = ...;
...
thrust::copy(start, end, std::ostream_iterator<data_T>(out, " "));
...
}
int cout(...) {
...
printTo(std::cout, ...);
...
}
int write(char* path, ...) {
...
std::ofstream file;
file.open(path);
printTo(file, ...);
...
}
}
Edit:
- Изменение к
int printTo(std::ostream &out, ...) {...}
не решает проблему. - Подробнее: Я прочитал данные в матрицу из
thrust::device_vector<T>
, скажемdvec
, и преобразовать его вdata_T
указательpvec
с помощьюthrust::raw_pointer_cast(&dvec[0])
(как библиотека CUBLAS использует сырые указатели). Затем я работаю наpvec
, а затем хочу распечатать его. - Я пытался печатать из указателя исходного
thrust::device_vector
непосредственно (т.е.*dvec
) и делает работы:thrust::copy((*dvec).begin(), (*dvec).begin() + n ...)
. Итак, почему я могу копировать только с помощью итераторов*dvec
, а не с помощью литографического указателяpvec
?
Вам не нужно, чтобы сделать 'printTo' шаблонную функцию. Просто первым аргументом будет ссылка 'std :: ostream'. –
@JoachimPileborg, спасибо - я изменил его на 'int printTo (std :: ostream & out, ...) {...}', как было предложено, но он все равно выводит мусор. Любые другие идеи? – mchen
Как вы храните "данные"? Как вы фактически инициализируете 'start' и' end'? –