簡體   English   中英

函數調用模板參數

[英]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.

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