C++11 如何在c++;11? 如何在cpp中实现该模板? 对于第一个问题:
我想写一个函数来连接字符串,它可以接收多个字符串C++11 如何在c++;11? 如何在cpp中实现该模板? 对于第一个问题:,c++11,parameter-passing,variadic-templates,C++11,Parameter Passing,Variadic Templates,我想写一个函数来连接字符串,它可以接收多个字符串 #包括 #包括 #包括 模板 std::string foo(const std::string&first,const Args&…senconds){ std::字符串分隔符=“$$”; std::string ret=first; 向量向量{senconds…}; 对于(自动秒=vec.rbegin();秒!=vec.rend();秒++){ ret=分隔符+*秒+分隔符+ret; } 返回ret; } 但当我像这样调用它时: std::
#包括
#包括
#包括
模板
std::string foo(const std::string&first,const Args&…senconds){
std::字符串分隔符=“$$”;
std::string ret=first;
向量向量{senconds…};
对于(自动秒=vec.rbegin();秒!=vec.rend();秒++){
ret=分隔符+*秒+分隔符+ret;
}
返回ret;
}
但当我像这样调用它时:
std::string name=“x”;
名称=foo(名称,“xxx”);
编译器将抛出一个错误:
错误:调用'foo(std:uu cxx11::string&,const char[4])时没有匹配的函数。
还有一些注意事项:
注意:无法推断模板参数“”
我认为我应该修改模板中的约束,并且我已经尝试了type\u traits
中的所有相关方法,但没有一种有效
关于第二个问题:
我想隐藏某些函数的实现,但对于模板函数,它无法将定义放入.hpp
,而将实现放入.cpp
,编译器将抛出未定义引用
错误。有什么优雅的方法可以解决这个问题吗
谢谢。这里有点东西要打开
std::衰变
template::type*=nullptr>
在这种形式中,可以像调用name=foo(name,stringRed,“xxx”)
一样调用函数foo
再次感谢@MaxLanghof。关于第二个问题,请参阅(不要因为问题标题而气馁)。但也请不要同时问两个独立的问题。旁白:您不需要
Args…
的每个元素都是std::string
,只需要可以实例化std::string
with@MaxLanghof,下次我将把两个问题分开。我已经尝试了c++11演示,但是如果foo(…)像foo(name,“xxx”)一样调用,它仍然找不到正确的模板实现。:36:12:错误:没有匹配的函数用于调用'foo'name=foo(name,stringRef,name,stringRef,“xxx”)代码>我已经这样修改了代码。因为当我将此代码应用到我的项目中时,出现了一个错误:错误:在“struct std::enable_如果”
@Patrick中没有名为“type”的类型,正如我所说的那样,使用is_same
您将无法传递字符串文字(请参阅最后一点)。这个错误大概是因为你试图不正确地使用它,但是我不能在没有看到你做了什么的情况下诊断它。但我看到你找到了适合你的东西,所以,这很好。
template <class... Args,
std::enable_if_t<
(std::is_same_v<std::decay_t<Args>, std::string> && ...)
>* = nullptr
>
template <class... Args,
typename std::enable_if<
var_and<
std::is_same<typename std::decay<Args>::type, std::string>::value...
>::value
>::type* = nullptr
>