我可以使用分配运算符构造,其中有超过1个参数

Can I use assignment operator construction with more than 1 argument?

本文关键字:参数 1个 可以使 分配 运算符 我可以      更新时间:2023-10-16

问题听起来可能是令人费解的,因此这是一个示例:

std::string s = "1984"; // This calls constructor, not copy assignment

现在std::string的构造函数采用超过1个参数,例如计数和char值。有没有一种方法可以使用该构造函数,而无需明确调用它?

我无法使用普通构造的原因是,我想使用函数的返回值来构造非特异性容器用户提供的时间,只要容器具有构造函数,请使用构造函数,而无需打扰我的函数的用户来存储存储返回值并致电构造函数)。

这是另一个代码的特定示例,其中函数的单个返回值可以触发构造函数调用,但是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::apply,但是有点尴尬:

struct X
{
    X(int, int);
};
auto get_params() -> std::tuple<int, int> { return {10, 20}; }
X x = std::apply([](int a, int b) { return X{a, b}; },
                 get_params());

您可以通过创建一个简单的实用程序功能来隐藏它来使其友好:

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

对于简洁的原因,我使用完美的转发省略了。您需要这样做。另外,您可能需要提供一个过载以接受std::pair。这只是基本的iDeea。您必须改进它。

不是您当前的设计。与其将参数返回构造函数要调用,为什么不返回对象本身呢?您将获得副本elision(在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));
}

然后这样称呼:

auto s_iter = last3_iter("0123456789"s);

对大多数(如果不是全部)容器都可以使用。