2013-06-04 35 views
2

我已經成功保存了變量,但不知道使用boost :: any的類型。但是我徘徊,是否可以使用它們而不實際將它們轉換回原始類型。這裏是可以說明問題更好的例子:我想我已經知道答案是否定的,因爲編譯將無法檢查變量的類型,但無論如何,我問也許有一個天才C++ boost :: any在不知道類型的情況下使用該值

struct callbackInfo 
{ 
    boost::any pointer_to_the_object; 
    boost::any pointer_to_the_function; 
}; 


class someClass 
{ 

    template<class T, class P> 
    void add(T const func, P that) 
    { 
     callbackInfo tmp; 
     tmp.pointer_to_the_object =that; 
     tmp.pointer_to_the_function = func; 
     functions->addLast(tmp); 
    } 

    template<class ARG> 
    void trigger(SENDERTYPE sender, ARG arg) 
    { 
     STLinkedListIterator<callbackInfo>* it = functions->createIteator(); 
     if(it != nullptr) 
     { 
      do 
      {   
       //This is the problem: 
       ((*it->getData().pointer_to_the_object).*it->getData().pointer_to_the_function)(nullptr); 
       it->next(); 
      }while(!it->EOL()); 
     } 
    } 
} 

解決方案。

+1

答案是否定的。但是,使用多態性最好解決的問題並不是你的問題(只是一個想法,因爲我對實際案例知之甚少)? –

回答

3

更換boost::any pointer_to_the_function;你能想到的boost::any爲更多類型安全void*,它可以指任何事情,但除非你知道它指的是,可以將其轉換回正確的有很少你可以用它做。

由於你真正想要存儲的是一個對象和一個指向成員函數的指針,然後調用它,所以你不需要使用完全通用的boost::any,你可以創建一個調用包裝器,將這兩件事綁定在一起,然後使用允許存儲和調用函數的東西,並且Boost提供了您需要的東西:

struct callbackInfo { 
    boost::function<void(void*)> func; 
}; 

template<class T, class P> 
void add(T func, P that) 
{ 
    callbackInfo tmp = { boost::bind(func, that, _1) }; 
    functions->addLast(tmp); 
} 

// ... 

it->getData().func(nullptr); 
+0

看來非常好。當我嘗試包含適當的hpp時,我不知道應該包含哪一個來獲得相同的結果。內部我已經得到了function1.hpp function2.hpp ....你能告訴我應該使用哪一個? – DalekSupreme

+1

@DarlekSupreme'#include ' – milleniumbug

+0

我沒有它,我只有function0.hpp。這是我的錯嗎? – DalekSupreme

1

其實沒有。至少不會與boost::any

但是,請注意,您對類型(一個是函數,另一個有您使用的字段(此處不確定,代碼在此不清楚))進行假設,因此您可以使用多態性和類層次結構。或者由於您已經使用了模板,靜態多態可以是適當的。

或許與boost::function<???> pointer_to_the_function;

相關問題