[英]function calls in template arguments
我正在努力應對以下情況。
#include "systemc.h"
template<int maxval>
class Foo {
/* Error: calls to constructors and functions cannot be part of a constant expression */
sc_uint<int(log2(double(maxval)))> a;
...
};
int main() {
Foo<10> foo;
...
return 0;
}
如上所述,模板化類'Foo'具有模板參數'maxval'。 'Foo'還擁有一個成員,同樣是一個模板化的類,它在模板參數中使用模板參數'maxval'和函數'log2'進行實例化。 但是,所描述的代碼將不起作用,因為例如函數調用不能是常量表達式的一部分。 您是否認為有可能在編譯期間評估例如log2(maxval)並將結果用於'Foo'中的其他模板參數?
謝謝你的幫助。 (我正在使用GCC 4.1.2)
模板需要編譯時值。 log2
函數需要constexpr
才能工作(事實並非如此)。
你必須定義自己的constexpr
功能。 對於基數2的對數函數,如果需要整數(切除浮點部分),它可以工作:
constexpr int log2(int number, int acc = 0) {
return number <= 1 ? acc : log2(number / 2, acc + 1);
}
編輯:
我沒有注意到問題是GCC 4.1,它不支持constexpr
。 雖然如果您可以使用該選項,您應該嘗試升級,但您也可以使用@ Florian的答案中提出的基於模板的解決方案。
編輯2:
如果您不想依賴Boost ,可以使用以下基於模板的簡單實現:
template<int V>
struct log2 {
static int const value = 1 + log2<V/2>::value;
};
template<>
struct log2<0> {};
template<>
struct log2<1> {
static int const value = 0;
};
然后你將它用作log2<13>::value
,這將導致3
。
又一個編輯:
上面的constexpr
實現將為0
和負數返回0
,這是一個錯誤。 對數值沒有定義為零或負值(在真實域中),因此可以調整函數以引發錯誤(因為它有點不可讀,我為格式化添加了一些換行符):
constexpr int log2(int number, int acc = 0) {
return number <= 0
? throw std::logic_error{"Logarithm of zero or negative number not allowed."}
: number == 1
? acc
: log2(number / 2, acc + 1);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.