2013-07-21 54 views
-2

我需要,所以我使用矢量使用相同類型作爲模板參數的元素列表,但我不知道如何使這項工作如何養活矢量元素模板

#include <iostream> 
#include <cstdint> 
#include <vector> 

template <uint8_t VAL> 
void foo() 
{ 
    std::cout << "__" << std::endl; 
}; 

template <> 
void foo<3>() 
{ 
    std::cout << "OK" << std::endl; 
}; 

int main() 
{ 
    std::vector<uint8_t> v = { 2, 4, 5, 2, 3, 55 }; 
    for (auto &k : v) { 
     foo<k>(); 
    } 
    return (0); 
} 

編譯器基本上抱怨k不是a constant expression,問題是我不知道如何修改這個使這個工作,我需要一些數據結構來迭代,所以我需要保持向量,我需要一個模板來簡化我的生活,所以我看到的越多,我就越感到被困在無限循環中。

+2

不,這不是模板的用例。這是'if(i == 3)cout <<「OK」;'的用例。 – 2013-07-21 06:29:55

+0

@ H2CO3你是什麼意思?你可以模擬一個數字值,這是肯定的,'<3>'超載只是爲了檢查模板調用的某些東西。我需要模板數值。 – user2485710

+0

@userXXX我知道你可以使用** integer **(不是任何數字)作爲模板參數。不是一個變量,只有一個編譯時常量。我說的是我沒有看到模板的必要性。這可能是一個XY問題。 – 2013-07-21 06:35:31

回答

3

你可以使用可變參數模板擺脫實際存儲在一個向量列表,所以你只需要直接值傳遞給變量函數模板:

#include <iostream> 

void print(int t) { 
    static char const *s [] = { "__", "OK" }; 
    std::cout << s[t == 3]; 
} 

void print() {} 

template<typename... Args> 
void print(int n, Args ... args) { 
    print(n); 
    print(args...); 
} 

int main() { 
    print(2, 4, 5, 2, 3, 55); 
} 

結果:

________OK__ 

但是,正如您所看到的,這仍然需要在運行時評估等於3。我毫不猶豫的說不能用做模板專業化,但至少手抓,我沒有看到如何做到這一點,如果有可能的話。

0

編譯器沒有可能在編譯時推斷k的可能值,所以我看不到這是如何工作的?

+0

這就是我需要解決的問題,我通常不會對已經工作的東西提出問題:D – user2485710

0

不,不適用於非常量表達式。只是讓一個普通的老功能:

#include <iostream> 
#include <cstdint> 
#include <vector> 

void foo(uint8_t VAL) 
{ 
    if(VAL == 3) 
     std::cout << "OK" << std::endl; 
    else 
     std::cout << "__" << std::endl; 
}; 

int main() 
{ 
    std::vector<uint8_t> v = { 2, 4, 5, 2, 3, 55 }; 
    for (auto &k : v) { 
     foo(k); 
    } 
return (0); 
} 
1

你不應該使用模板,如果任何需要去<here>不能在編譯時平凡推斷。在這種情況下,k不是一個常量表達式,因此您不能將其用作模板參數。

模板不是魔術錘。他們有很多用例,但是絕對不可以使用它們。

在這個特定的代碼片段中,foo應該定義爲void foo(uint8_t)


是的,事實上我的問題是如何把這一載體引入恆編譯時設定值,真正的問題是不是真正的模板。

您可能可以使用可變參數模板將其關閉。您可以直接在可變參數模板(foo<2, 4, 5, 2, 3, 55>)中使用積分常數,而不使用向量。

我不太喜歡他們,所以這需要一段時間。

編輯:傑裏打敗了我。

+0

但我可以輕鬆地重載模板以修改單個值的行爲,但我無法使用其他解決方案你建議的那個。 – user2485710

+0

它只是不可能使用運行時值作爲模板參數。模板是編譯時功能。因此需要不斷的表達。 – iolo

1

如果你真的想要的方式來遍歷整數值的編譯時間常數列表:

#include <iostream> 
#include <cstdint> 

template <uint8_t VAL> 
inline void foo() 
{ 
    std::cout << "__" << std::endl; 
} 

template <> 
void foo<3>() 
{ 
    std::cout << "OK" << std::endl; 
} 

template <uint8_t... Values> 
struct FooHelper { 
    static void foo_all() { 
    } 
}; 

template <uint8_t First, uint8_t... Rest> 
struct FooHelper<First, Rest...> { 
    static void foo_all() { 
    foo<First>(); 
    FooHelper<Rest...>::foo_all(); 
    } 
}; 

template <uint8_t... Values> 
void foo_all() 
{ 
    FooHelper<Values...>::foo_all(); 
} 

int main() 
{ 
    foo_all<2, 4, 5, 2, 3, 55>(); 
} 

雖然老實說,我沒有看到它的使用情況。