Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以用赋值运算符构造多个参数吗?_C++ - Fatal编程技术网

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