【发布时间】:2016-01-13 08:26:59
【问题描述】:
情况如下:
#include <utility>
#include <typeinfo>
#include <iostream>
struct C1
{
char const* str;
template <typename T> operator T() const { std::cout << "Convert to " << typeid(T).name() << "\n"; return {}; }
};
struct C2
{
C2(C1 const&) { std::cout << "C2(C1)\n"; }
C2(std::initializer_list<std::pair<char const*, int>>) { std::cout << "C2(list)\n"; }
};
int main()
{
C1 c1{};
C2 c2{c1};
}
输出表明正在调用C2(list)。
我希望为 C1 参数调用 C2(C1),但我需要 std::initializer 列表的参数保持可推导和可转换,并且我不能用可变参数模板版本替换它。我只是想控制构造顺序,但是这里 //2 甚至不是模板。假设类型 std::pair 可以在正常情况下反序列化。可以使用C++14
【问题讨论】:
-
问题是
{}调用initializer_list构造函数,它优先于通常的构造函数。称它为C2 c2(c1)有什么问题?或者您希望在您的 API 中使用这种特定语法? -
我猜你应该将
operator T替换为 C1 可以转换为的实际类型。或者更好的是,使用命名函数而不是转换运算符,并在需要时实际调用该函数。 -
@romeric 这不仅仅是我的界面。如果我在内部使用它,我会这样做
-
@M.M 它确实通过增强反序列化反序列化对象,这是为了反序列化用户想要的任何类型的对象,我不能用具体类型替换它
-
@M.M.我在努力。在我的情况下,不可能使用命名函数。
C1被设计为代理类,并由某些容器的迭代器返回。C2是不可复制的、不可移动的和不可分配的new类。 c2 = c1 必须调用 c2 的构造函数。无法调用转换 c2 = c1.asT(),因为 C2 的移动和复制构造函数已被删除。 initializer_list 真的让所有 API 都崩溃了
标签: c++ type-conversion c++14 initializer-list