gpt4 book ai didi

C++ 函数重载模板值

转载 作者:行者123 更新时间:2023-11-30 04:11:35 25 4
gpt4 key购买 nike

我一直无法使用默认值声明模板函数。

我不是在寻找类似 void do_thing<int val = 2>() { 的东西,而是一个函数,它使用类似 void do_thing<2>() { 的语法覆盖另一个模板函数.

我知道这对于类是可能的,例如(from a tutorial):

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();};

在声明语法中,它与上面的代码几乎相同,除了它会产生一个编译器错误,告诉我我的模板格式错误。


如果可能可能,请告诉我(当然,如何)。否则,如果不是这种行为,请轻轻地告诉我。

编辑: 已修复!

要修复它,需要一个函数原型(prototype)作为两个模板函数的基础。如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

关于C++ 函数重载模板值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20171537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com