2016-01-06 101 views
1

我有一個像模板函數指針重載

template<typename T> T ABS(const T& DiIN){ 
    return (0 > DiIN) ? T(DiIN * (-1)) : T((DiIN)); 
} 

template<typename T> T ADD(const T DiIN1, const T DiIN2) { 
    return DiIN1 + DiIN2; 
} 

我需要調用該函數ABS和/或使用一個單一的函數指針添加模板功能。 目前我使用了兩個不同的函數指針名稱,但是當我使用不同的參數長度包含更多的模板函數時,發現它變得越來越複雜。

我當前的實現是像

template<typename T> 
struct test { 
    std::string funcName; 
    T(funcptr1 *)(T); 
    T(funcptr2 *)(T, T); 
}; 

test<int> ltest[] = { {"ABS", ABS, NULL}, {"ADD", NULL, ADD} }; 

有沒有辦法來 1)使用單一的函數指針 2)擺脫初始化test<int>和使用test<T>,這樣我可以在使用任何變量類型運行?

我要尋找一個簡單的初始化像

template<> //template<typename T> 
test<T> ltest[] = = { {"ABS", ABS}, {"ADD", ADD}, ..... }; 

回答

2

是否有使用單一的函數指針的方法嗎?

可能有一種方法可以使用std::function。但是,通過提供一些構造函數,您可以獲得簡單性。現在

template <typename T> 
struct test { 

    using function1_type = T(*)(T); 
    using function2_type = T(*)(T, T); 

    test(std::string fname, function1_type f1) : funcName(fname), funcptr1(f1), funcptr2(nullptr) {} 
    test(std::string fname, function2_type f2) : funcName(fname), funcptr1(nullptr), funcptr2(f2) {} 
    test(std::string fname, function1_type f1, function2_type f2) : funcName(fname), funcptr1(f1), funcptr2(f2) {} 

    std::string funcName; 
    function1_type funcptr1; 
    function2_type funcptr2; 
}; 

,你將能夠使用:

test<int> ltest[] = { {"ABS", ABS}, {"ADD", ADD}, {"MIXED", ABS, ADD} }; 

如果要禁止使用的{"MIXED", ABS, ADD}構造一個對象,你可以刪除最後一個構造函數。

順便說一句,爲了使用上面,你將需要修改ABSADD使參數類型沒有constconst&。他們需要的是:

template<typename T> T ABS(T DiIN){ 
    return (0 > DiIN) ? T(DiIN * (-1)) : T((DiIN)); 
} 

template<typename T> T ADD(T DiIN1, T DiIN2) { 
    return DiIN1 + DiIN2; 
} 

有擺脫初始化test<int>的方式use test<T>這樣我就可以在運行時使用任何變量類型?

不,你不能那樣做。在編譯時,用於實例化模板的類型必須爲

+0

@R Sahu:我還需要使用funcptr1來調用ABS和funcptr2來調用ADD?有沒有一種方法來實現相同的使用可變參數模板? – kar

+0

@ user2896993,你可以這樣做,但它不會直截了當。我好奇。有沒有一個真正的問題,你試圖解決,或者這是一個知識分子的好奇心? –

+0

@R Sahu:我需要一個解決方案。大約有700多個這樣的小模板函數具有不同的數據類型和參數長度。我的代碼在運行時變得越來越耗時,如果我使用if else或switch case來確定我需要調用哪個函數指針(函數)。 – kar