C++函数重载模板值

C++ Function overloading template value

本文关键字:重载 函数 C++      更新时间:2023-10-16

我在用默认值声明模板化函数时遇到了问题

我不是在寻找类似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();或以上声明

此外,template<>void skip_token<2>()之前是必需的

这些只是例子。对于阅读此问题的人来说,用符合您需求的代码替换此代码是相当容易的。

这是你想要的东西吗?(我知道,这是一个单独的例子,但仍然…)?

#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