关于可变参数模版

bear234 2016-11-13 12:28:30
#include <iostream>
#include "Generator.h" // user-defined class

char getChar(Generator & generator)
{
return generator.generateChar();
}

char getChar(int pos, const string & s)
{
return s[pos];
}

template<typename... StringType>
void func(Generator & generator, StringType &&... str)
{
generator.init();
char ch;
int size = sizeof...(StringType);
// lots of things to do
if (size == 0)
{
ch = getChar(generator);
}
else
{
ch = getChar(1, std::forward<StringType>(str)...); // ERROR here
}
}

int main(int argc, char ** argv)
{
Generator generator;

func(generator);
func(generator, "abc");

return 0;
}





最一开始,我写了两个函数func,也就是说我把func重载了:
void func(Generator & generator);
void func(Generator & generator, const std::string & str);

然后我发现这两个函数的大部分代码都是一样的,只有对ch的赋值运算部分不一样。
我的第一反应是删掉第一个func,然后给第二个func的string参数一个特殊的值,比如空字符串。这样在func里就可以这样:
if (str.empty())
{
ch = generator.generateChar();
}
else
{
ch = str[1];
}


但是我觉得这样不太好,万一我哪一天就是想处理空字符串怎么办?

于是我想到了可变参数模板,把ch的赋值部分写成了两个重载的getChar函数,这样func只需要一个就可以了。

然而上面的代码报错了,原因是当func只接受一个参数generator时,...展开为空。所以在func里面的else部分就成了:
ch = getChar(1); ---- 找不到匹配的函数

这时候,似乎只有两个办法了:
要么给第二个getChar的string一个默认参数,要么再写一个getChar(int)。

如果用第一个方法,似乎和我最一开始的想法(写一个func,给string参数一个默认值)没什么区别了:我既没有避免了有默认值的参数,又没有避免func里的if else。

而如果用第二个方法,getChar(int)就是一个毫无意义的函数。




请问:我这样的设计好吗?有没有更好的设计?在这里用可变参数模板对吗?还是说我应该简单点直接给func的string参数一个默认值完事?
...全文
180 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ArthurJava 2016-11-13
  • 打赏
  • 举报
回复
可变参数模板还真没用过 用这个函数怎么样? void fun(Generator & generator, std::vector<StringType> str);
ArthurJava 2016-11-13
  • 打赏
  • 举报
回复
可变参数模板还真没用过 用这个函数怎么样? void fun(Generator & generator, std::<StringType> str);
fefe82 2016-11-13
  • 打赏
  • 举报
回复
引用
然后我发现这两个函数的大部分代码都是一样的,只有对ch的赋值运算部分不一样。
你可以把这“大部分代码”拿出来做一个单独的函数,在 func 的两个重载里分别调用这个函数。

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧