2013-02-25 5 views
1

Я разработки библиотеки, которые имеют интерфейс C для целей совместимостиПродвижение сырой указатель на valarray

void interface(double* context, size_t num_elements); 

в то время как context указывает на сырой памяти хранения num_elementsdouble с. В оставшейся части кода есть ли какие-либо стратегии для построения std::valarray, которые временно управляют context, не освобождая его после завершения вызова библиотеки?

+0

Просто, чтобы напомнить вам об этом посте и услышать ваши комментарии по поводу моего ответа :) – Sheljohn

ответ

0

Не могли бы вы создать простой контейнер в соответствии с вашими потребностями? Вот небольшой пример, который я не сделал тест:

template <class T> 
class custom_valarray 
{ 
public: 

    // Ctor/dtor 
    custom_valarray() { clear(); } 
    ~custom_valarray() { clear(); } 
    custom_valarray(T *ptr, const unsigned &s) { set(ptr,s); } 

    // Clear container 
    void clear() { data = nullptr; size = 0; } 

    // Set data 
    void set(T *ptr, const unsigned &s) { data = ptr; size = s; } 

    // Test if container is set 
    operator bool() const { return data; } 
    bool empty() const { return data; } 

    // Accessors 
    T* data() { return data; } 
    T& operator[] (const unsigned &i) 
    { 
     static T garbage; 
     return i < size ? data[i] : garbage; 
    } 

    // Iterators 
    T* begin() { return data; } 
    T* end() { return data+size; } 

private: 

    T *data; 
    unsigned size; 
}; 
+0

Ну, конечно, это хорошо, но я знаю, что valarray имеет специальную оптимизацию в C++ в некоторых случаях. – xis

+0

Какую операцию вы намерены делать с вашей валармой, которая требует оптимизации? Хотя нет никакой магии, вы можете проверить стандартную реализацию там, если необходимо: http://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a01109_source.html – Sheljohn