2012-06-15 16 views
0

說我們有N功能overrites,我們收到argunments陣列,解析它變成某些類型的(說我們第一次得到intstringstring;第二次我們得到intintint);現在我們要求第一組參數我們的call(int, string, string)而第二次call(int, int, int)。我們可以檢測哪些函數需要動態調用參數類型數組?我們可以通過運行時給出的參數來檢測要調用的函數嗎?

+0

你是什麼意思「解析參數數組」?你是否收到一個你正試圖轉換爲整數和子串的字符串? – Rook

+0

這是函數模板的用途。如何結束,在函數中完成的操作必須由實例化類型支持。但模板是一個編譯時間的概念。我不明白朮語「參數類型數組」。 – Mahesh

回答

1

在運行時,您不能在C++中進行類型選擇。這是因爲C++Strongly typed語言之一。

你可以做一些類似於你在例如Python--變量在運行期間很樂意改變它們的類型。

您可以使用繼承類和派生類關閉 - 但不完全相同。如果你有一個超類,你可以有一個「工廠」函數返回一個指向超類的指針(根據某些輸入包含一個diff對象)。現在,如果所有對象都實現了所需的功能,則可以在指針上調用一個函數。例如:

class Base{ 
    virtual void functionality(); 
}; 

class Squirrel : public Base{ 
    void functionality() { 
     std::cout << "I love hazelnuts!" << std::endl; 
    } 
}; 

class Box : public Base{ 
    void functionality() { 
     std::cout << "Stuff can be put in here!" << std::endl; 
    } 
}; 


Base *factoryMethod(std::string someInput){ 
    if (someInput == "1") 
     return new Squirrel(); 
    else 
     return new Box(); 
} 

int main(void){ 
    std::cin >> input; 
    Base *object = factoryMethod(input); 
    object->functionality(); 
    return 0; 
} 
+0

除非您剛剛分析了一段文本,建立了該文本中條目的類型並運行了if語句的加載並適當地解除了參數。但誰知道OP正在嘗試做什麼! – Rook

+0

@即使如此,你不能有一個函數'if(arg_is_int)return(int)(value);否則返回(字符串)值;'。所有類型都是在編譯時預先確定的! – penelope

+0

'vector atypes = parse(args); if(atypes [0] == argtypes :: string && atypes [1] == argtypes :: int)despatch_fun(string(args [0]),convert_arg (args [1]));'等等 – Rook

1

你可以簡單地寫一個帶有相關參數的重載成員函數嗎?

如果您收到未知數​​量的參數,並希望根據它們調用正確的函數,那麼您將需要一些額外的工作。也許有一個枚舉作爲第一個參數暗示參數集例如:

enum eParamList 
{ 
    eParamList_START, 
    IntIntInt,   // following data is 3 ints 
    IntIntChar,   // following data is int, int, bool (only joking its a char) 
    eParamList_ENDS 
} 

或者類似的東西?

1

這是低技術的做法。我不清楚你的意思是由參數類型數組,但假設給出了一種稱爲args的向量,並且可以確定一個元素是否爲數字,然後將該元素轉換爲數字或字符串。然後,你可以實現這樣一個循環:

std::string s[3]; 
int n[3]; 
unsigned mask = 0; 
for (int i = 0; i < args.size(); ++i) { 
    if (is_number(args[i])) { 
     mask |= (1U << i); 
     n[i] = get_number(args[i]); 
    } else { 
     s[i] = get_string(args[i]); 
    } 
} 

然後,在掩蔽用開關:

switch (mask) { 
case 0x01: call(n[0], s[1], s[2]); break; 
case 0x07: call(n[0], n[1], n[2]); break; 
default: 
    std::cout << "unhandled combination: " << mask << std::endl; 
    break; 
} 
相關問題