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
    >