不为emplace()定义构造函数的解决方法

时间:2018-08-14 19:31:52

标签: c++ c++11

自C ++ 11以来,我们已经进行了汇总初始化:

DECLARE @Names VARCHAR(8000);

-- this may be tricky especially when ORDER BY is involved
SELECT @Names = COALESCE(@Names + ', ', '') + column_name   
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'A'  AND column_name LIKE 'DM_%';

DECLARE @sql NVARCHAR(MAX) = N'SELECT <cols> INTO B FROM A';
SET @sql = REPLACE(@sql, '<cols>', @Names);

PRINT @sql;

EXEC sp_executesql @sql;

但是为了这项工作:

struct S {
    int count;
    double value;
};
S s{2, 3.0};

我们需要无缘无故地手动编写一个构造函数:

vector<S> v;
v.emplace_back(2, 3.0);

我们还需要此构造函数才能使struct S { int count; double value; S(int count, double value): count(count), value(value) {} }; optional(in_place, ...)正常工作。

是否存在不手动编写此构造函数的解决方法?

它不会添加任何信息,只是重复已经存在的信息两次。同样,编译器也可以像编写聚合初始化那样自己编写它。

我能够在Egg的变体中添加新的构造函数,从而允许这样做,但我们可以做一些事情而无需修改容器的源代码吗?

编辑:该问题:Why doesn't emplace_back() use uniform initialization?与之相关,但没有提供解决方法。

1 个答案:

答案 0 :(得分:0)

您至少有一个隐式构造函数。

plainto_tsquery

({std::vector<S> v; v.emplace_back(S{2, 3.0}); emplace_back在这种情况下可以互换。)