#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)
被调用。
我想C2(C1)
被调用为C1
参数,但我需要std :: initializer列表的参数保持可以被推导和转换,并且我不能用variadic-templated版本替换它。我只想控制施工顺序,但这里// 2甚至不是模板。假设类型std :: pair可以在正常情况下被反序列化。 C++ 14可用于
的问题是'{}''调用构造函数initializer_list',其中有超过一般的构造函数优先。把它叫做C2 C2(C1)'有什么不对?或者你想在你的API中使用这种特定的语法? – romeric
我想你应该用C1可以转换的实际类型替换'operator T'。或者甚至更好,使用一个命名函数而不是转换运算符,并在需要时实际调用该函数。 –
@romeric这不仅仅是我的界面。如果我在内部使用它,我会这样做 –