2013-01-23 180 views
2

我想捕獲編譯時間傳遞給模板類型的函數的常量整數。未來的目標是推出我自己的(非常有限的)表達式模板,該模板從非常簡單的表達式(編譯時間常量int和變量之和)創建表達式,例如:-2 * i + 3 * k。integral_constant和模板參數扣除

我開始很慢,我有以下代碼:2

struct Foo { 
    Foo (int i) : i_(i) {} 

    int i_; 
}; 

template <int N> int operator*(std::integral_constant<int, N> i, Foo j) { 
    return N * j.i_; 
} 

int main(void) { 
    std::integral_constant<int, 2> k; 
    int i = k * Foo(3); 
    cout << i << endl; 

    int j = 2 * Foo(3); 
    cout << j << endl; 
} 

模板參數推導失敗*美孚(3)。 我已經讀過,沒有這樣的東西作爲一個函數的constexpr參數。

有沒有辦法實現我想要的?

+0

使operaator,構造,並導致「constexpr」。 –

+0

感謝您的回覆,我不能使它工作不幸:我修飾了j,運算符和Foo構造函數的定義,我仍然使用gcc-4.6和clang ++獲得相同的模板演繹錯誤。你介意發佈一個編譯的修改版本嗎?另外,一般來說,Foo可能不是一個constexpr,而是我的表達中更通用的術語。 – NickV

+0

我懷疑你可以把2變成一個integral_constant 。你必須至少寫我(2)或類似的東西,我是一個宏。表達式模板中有什麼用int_cst類型的成員int來存儲數字2.不完全一樣... –

回答

3

你可以做到沒有模板。這個答案或多或少的擴張@ MooingDuck的建議轉化爲具體的代碼,你可能會發現更容易理解:

#include <type_traits> 

using namespace std; 

struct Foo { 
    constexpr Foo (int i) : i_(i) {} 
    int i_; 
}; 

constexpr int operator*(int i, Foo j) { 
    return i * j.i_; 
} 

int main(void) { 
    integral_constant<int, 2> k; 

    constexpr int i = k * Foo(3); 
    static_assert(i == 6, "Error!"); 

    constexpr int j = 2 * Foo(3); 
    static_assert(j == 6, "Error!"); 
} 
+1

http://stacked-crooked.com/view?id=90398ee0c8dd684a0cf53f6fb34dbe7e哦,嘿,'integral_constant '有一個隱式轉換爲'int'?我不知道!這是新的嗎?這段代碼很好。 –

+2

@MooingDuck:它在C++標準的第20.9.3節中有規定。 'integral_constant <>'有一個'constexpr'轉換運算符到底層類型(是的,運算符沒有標記爲'explicit') –