簡體   English   中英

C ++模板:使用對模板實例化類型的隱式轉換來選擇重載函數!

[英]C++ Template : Choosing overloaded functions using implicit conversion to template instantiated type!

考慮這些重載函數,

void fun(Int2Type<1>) {}
void fun(Int2Type<2>) {}
void fun(Int2Type<3>) {}
void fun(Int2Type<4>) {}

我想這樣稱呼這些

fun(1); // this should call first function
fun(4); // this should call fourth function

有沒有辦法做到這一點? 如果是,那么我們可以使用一些運行時值來做到這一點嗎(請注意,在上面的調用中,參數在編譯時是已知的)

fun(value); // value can be decided at runtime!

還是沒有其他選擇? 目標是,應基於不同的整數值調用不同的函數!


編輯

順便說一句,我不能使用以下任何一項:

  1. 使用switch(value)
  2. 使用一些SomeFuncTable funTable[] = {fun(Int2Type<1>(), fun(Int2Type<2>()}

不,沒有辦法將運行時值用作模板參數。 您唯一可以做的就是:

void fun(int x) {
    switch(x) {
    case 1:
        fun(Int2Type<1>());
        break;
    case 2:
        fun(Int2Type<2>());
        break;
    case 3:
        fun(Int2Type<3>());
        break;
    case 4:
        fun(Int2Type<4>());
        break;
    }
}

無法完成您想要的事情,因為它們全都歸結為同一個東西-跳轉表或一系列if / else。 而已。 其他任何功能都將變成這樣。 只是做一個跳台。 您可以使用函數指針數組(最快)或更靈活的unordered_map<int, std::function<void()>>例如unordered_map<int, std::function<void()>>

哦,除非您想編寫自己的JIT編譯器並在需要時將新的匯編代碼JIT所用。 你可以那樣做。 但是我並沒有真正理解這一點,因為您仍然遇到相同的問題-如何選擇要采用的代碼路徑,這將成為跳轉表或if / else鏈。

您可以做一些不同的事情:

template<int N> void func();
template<> void func<1>(){/*the body*/}
template<> void func<2>(){/*the body*/}

然后您可以調用: func<1>()

或者,您可以通過以下方式調用原始代碼: func(Int2Type<1>())

無論如何,所有這些僅適用於編譯時間常數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM