C++ 我可以用赋值运算符构造多个参数吗?
这个问题听起来可能很复杂,所以下面是一个例子:C++ 我可以用赋值运算符构造多个参数吗?,c++,C++,这个问题听起来可能很复杂,所以下面是一个例子: std::string s = "1984"; // This calls constructor, not copy assignment 现在,std::string具有接受多个参数的构造函数,例如count和char value。 有没有一种不用显式调用构造函数的方法 我不能使用常规构造的原因是,我想使用函数的返回值来构造用户提供的非特定容器,只要该容器的构造函数使用了2个迭代器(而不需要麻烦函数的用户存储返回值并调用构造函数) 下面是另一
std::string s = "1984"; // This calls constructor, not copy assignment
现在,std::string
具有接受多个参数的构造函数,例如count和char value。
有没有一种不用显式调用构造函数的方法
我不能使用常规构造的原因是,我想使用函数的返回值来构造用户提供的非特定容器,只要该容器的构造函数使用了2个迭代器(而不需要麻烦函数的用户存储返回值并调用构造函数)
下面是另一个代码的具体示例,其中函数的单个返回值可以触发构造函数调用,但IDK如何使用多个返回值来触发
std::pair<const char*,const char*> last3_iter(const std::string s){
assert(s.size()>3);
return std::pair{s.data()+s.size()-3, s.data()+s.size()};
}
const char* last3_ptr(const std::string s){
assert(s.size()>3);
return s.data()+s.size()-3;
}
int main()
{
{
std::string s_ptr = last3_ptr("0123456789");
std::cout << s_ptr << std::endl;
}
{
// Is it possible to rewrite last3_iter so
// that assignment operator does equivalent to this code?
auto range = last3_iter("0123456789");
std::string s_iter(range.first, range.second);
std::cout << s_iter << std::endl;
}
}
std::pair last3_iter(const std::string s){
断言(s.size()>3);
返回std::pair{s.data()+s.size()-3,s.data()+s.size()};
}
常量字符*last3_ptr(常量标准::字符串s){
断言(s.size()>3);
返回s.data()+s.size()-3;
}
int main()
{
{
std::字符串s_ptr=last3_ptr(“0123456789”);
std::cout与您当前的设计不符。与其将参数返回给构造函数调用,为什么不返回对象本身呢?您得到了复制省略(以及C++17之前的RVO),因此它没有性能损失(在最坏的情况下,这是一个移动)
我不知道你在想什么样的设计,但也许你可以这样做:
template<typename T>
T last3_iter(const T& container) {
assert(std::size(container) > 3);
return T(std::next(std::begin(container), std::size(container) - 3), std::end(container));
}
这将适用于大多数(如果不是所有)容器。您可以使用std::apply
,但这有点尴尬:
struct X
{
X(int, int);
};
auto get_params() -> std::tuple<int, int> { return {10, 20}; }
您可以通过创建一个简单的实用程序函数来隐藏以下内容,从而使其对用户友好:
template <class T, class... Args>
auto apply_to_ctor(std::tuple<Args...> tp_args) -> T
{
return std::apply([](Args... largs) { return T{largs...}; },
tp_args);
}
模板
自动将参数应用到参数(std::tuple tp参数)->T
{
return std::apply([](Args…largs){return T{largs…};},
tp_-args);
}
然后按如下方式使用:
X x2 = apply_to_ctor<X>(get_params());
x2=apply_to_ctor(get_params());
为了简洁起见,我省略了使用完美转发。你需要这样做。你可能还想提供一个重载来接受std::pair
。这只是基本的想法。你必须改进它。last3\u ptr是C++11中的UB,如果你担心的话,一个好的编译器会优化并删除该变量。我想,这主要是关于可用性的用户能够从我函数的返回值构造std::string、std::vector和std::unordered_集。就像我说的,我不想限制s_iter的类型,所以我希望用户能够从我函数的返回值构造std::string、std::vector和std::unordered_集。这就是我被卡住的原因。我知道如何使用基本模板es.@nosenseal然后您可以将另一个模板参数传递给last3\u iter
。或者您的意思是希望能够从一个函数调用构造多个容器吗?不,只有一个容器,但我不知道,aka用户可以提供任何类型,只要它的构造函数使用2个迭代器。@nosenseal您的函数不是generic够了-我更新了我的答案,但我仍然不太明白你的观点。也许你可以提供一个用例?用户希望在容器中存储字符串的子序列。我不知道那个容器是什么。我不想强迫用户指定它,所以举个例子,我想避免自动结果=last3(str);我更喜欢字符串result=last3(str);但我不知道如何做到这一点。哇,很好。但我怀疑这是否值得努力:P@Rakete1111我也会这么说,但这是一种选择。
template <class T, class... Args>
auto apply_to_ctor(std::tuple<Args...> tp_args) -> T
{
return std::apply([](Args... largs) { return T{largs...}; },
tp_args);
}
X x2 = apply_to_ctor<X>(get_params());