我可以使用分配运算符构造,其中有超过1个参数
Can I use assignment operator construction with more than 1 argument?
问题听起来可能是令人费解的,因此这是一个示例:
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);
对大多数(如果不是全部)容器都可以使用。
相关文章:
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 在不传递参数数量且只有3个点的情况下,如何使用变差函数
- 带有多个独立参数的C++For循环
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 具有多个转换的模板参数推导
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- 如何将可变参数模板转换为多个单个模板?(C++竞争编程调试模板)
- 如何允许模板参数中的类类型,仅当它有两个基类时
- c++ 构造函数 将 1 个字符串参数转换为 3 个属性
- 运算符重载:"operator+"必须采用零个或一个参数
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 为什么 c++11 std::lock 和 std::scoped_lock 至少需要 2 个参数?
- 具有多个参数的模板化类专用化,其中一个模板参数是模板本身
- 我应该如何在没有变量的情况下将相同的参数传递给 CMAKE 中的多个目标?
- C++如果两个模板函数都与参数列表匹配,将调用哪个模板
- 如何实现具有多个平台__FILE__和__LINE__信息的 C/C++ 可变参数日志记录宏?
- 如何从两个不同的函数传递参数
- 为什么C CHAR数据类型3D数组通过参数第一个括号为空白
- 什么时候使用size_t作为模板函数的参数是个坏主意
- 警告:正在传递第1个参数(共个)..从不带强制转换的整数生成指针