2011-03-08 58 views
2

我有一些遺留的代碼看起來像這樣:鑄造的boost :: shared_array <void>提振:: shared_array <int>

void* getData(DataType dataType) 
{ 

    switch(dataType) 
    { 
    case TYPE_FLOAT: 
     return new float[ rows * clms ]; 

    case TYPE_INT: 
     return new int[ rows * clms ]; 

    case TYPE_DOUBLE: 
     return new double[ rows * clms ]; 
    default: 
     return NULL; 
    } 
} 

我希望能夠做到這一點:

boost::shared_array <void> getData(DataType dataType) 
{ 

    boost::shared_array <void> theData; 

    switch(dataType) 
    { 
    case TYPE_FLOAT: 
     theData = boost::shared_array<float>(new float[ rows * clms ]); 
        break; 

    case TYPE_INT: 
     theData = boost::shared_array<int>(new int[ rows * clms ]); 
        break; 

    case TYPE_DOUBLE: 
     theData = boost::shared_array<double>(new double[ rows * clms ]); 
        break; 

    default: 
     break; 
    } 

      return theData; 
} 

但我無法得到正確的演員。我需要做些什麼才能使這個聲明起作用?

回答

6

你不能只是轉換,因爲shared_array<void>不知道如何刪除void*指針指向一個數組int

你可以嘗試類似shared_array<void>(new int[rows*clmns], checked_array_deleter<int>())的東西,雖然我沒有測試過它是正確的。您可能需要將刪除程序封裝到將參數轉換爲int*的東西中。

或者,由於您的所有類型都是POD,因此您可以使用charshared_array<char>的數組。然後,不需要指定刪除者。

順便說一句,在這裏插入通常抱怨這是一個狡猾的設計。如果您指的是void*或void智能指針,那麼您由於某種原因忽略了C++是靜態類型語言。你可能會看Boost.Variant,這取決於你的數組是如何使用的。

+1

你是接近正確答案,則刪除器已經連接,問題是,不像在shared_ptr的不投,因爲它是對陣列有危險。 – CashCow 2011-03-08 14:43:41

1

它不適用於shared_array,使用shared_ptr。

boost::shared_ptr <void> getData(DataType dataType) 
{ 
    boost::shared_ptr <void> theData; 

    switch(dataType) 
    { 
    case TYPE_FLOAT: 
     theData = boost::shared_ptr<float>(new float[ rows * clms ], 
      boost::checked_array_deleter<float>()); 
    break; 

    case TYPE_INT: 
     theData = boost::shared_ptr<int>(new int[ rows * clms ], 
     boost::checked_array_deleter<int>()); 
    break; 

    case TYPE_DOUBLE: 
     theData = boost::shared_array<double>(new double[ rows * clms ], 
     boost::checked_array_deleter<double>()); 
    break; 

    default: 
     break; 
    } 

    return theData; // I think will work 
} 

如果這回不工作,這將:

return boost::shared_ptr<void>(theData, theData.get());