簡體   English   中英

C ++函數重載模板值

[英]C++ Function overloading template value

我一直難以獲得要使用默認值聲明的模板化函數。

我不是在尋找像void do_thing<int val = 2>() { ,而是在函數中使用void do_thing<2>() {類的語法來覆蓋另一個模板化函數。

我知道這對於像這樣的類是可能的,例如( 來自教程 ):

template< int i >
class FACTOR{
public:
   enum {RESULT = i * FACTOR<i-1>::RESULT};
};

class FACTOR< 1 >{
  public:
  enum {RESULT = 1};
};

引用FACTOR <1>的位置不會轉到上面的類聲明,而是轉到底部。
對我來說,問題是我不能在聲明函數時做同樣的事情。 我的語法錯誤或無法實現。


這是我嘗試使用的代碼示例:

template<int tokens>
void skip_token() {
    for(int i = 0; i++ < tokens;) gettoken();
}

void skip_token<2>() {gettoken(); gettoken();};

在聲明語法中,它與上面的代碼幾乎相同,除了它會產生一個編譯器錯誤,告訴我我格式化模板錯誤。


如果可能的話,然后讓我知道(怎么樣,當然)。 否則,請讓我知道是否不是這種行為。

編輯: 固定!

要修復它,需要一個函數原型作為這兩個模板化函數的基礎。 template<int tokens> void skip_token(); 在頭文件或以上聲明中。

另外,在void skip_token<2>()之前必須有template<>

這些僅是示例。 對於閱讀此問題的人來說,用適合您需求的代碼替換此代碼相當容易。

是那種你要找的東西嗎? (我知道一個單獨的例子,但仍然...)?

#include <iostream>
#include <cstdlib>

void gettoken()
{
    std::cout << "gettoken" << '\n';
}

// general decl
template<size_t n> void skip_token();


// impl
template<size_t n>
void skip_token()
{
    gettoken();
    skip_token<n-1>();
}

// specialize
template <>
void skip_token<1>()
{
    gettoken();
}

int main()
{
    skip_token<4>();
    return EXIT_SUCCESS;
}

產量

gettoken
gettoken
gettoken
gettoken

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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