template struct A {};
template struct B
{
B(A); // implicit A->B conversion
};
template void fun(B...);
int main()
{
A a;
fun(B(a)); // works
fun(a); // does not work (deduction failure)
}
, everything works. That means that deduction can do implicit conversion using upcasting. So it seems weird that it can not do implicit conversion using a constructor.
Есть ли способ заставить вывод шаблонов работать с (неявным) преобразованием? Как в следующем примере: [code]template struct A {};
template struct B { B(A); // implicit A->B conversion };
template void fun(B...);
int main() { A a; fun(B(a)); // works fun(a); // does not work (deduction failure) } [/code] My thoughts: [list] [*]If [code]A[/code] is a subclass of [code]B[/code], everything works. That means that deduction can do implicit conversion using upcasting. So it seems weird that it can not do implicit conversion using a constructor. [*]Overloading [code]fun[/code] for [code]A[/code] and [code]B[/code] is possible in principle, but for multiple parameters, there are just too many combinations [*]Adding a deduction guideline ([code]template B(A)->B;[/code]) does not change anything. [/list] EDIT: some context: In my actual code, [code]A[/code] is a (large) container, and [code]B[/code] is a lightweight non-owning view object. The situation is similar to the fact that [code]std::vector[/code] can not be implicity converted to [code]std::span[/code] during deduction of [code]T[/code], even though for any concrete [code]T[/code], such a conversion exists.
Я работаю над математической библиотекой, и мне хотелось бы иметь возможность преобразовать ее для использования новых интерфейсов INumber в System.Numerics. Приведенные здесь методы часто находятся на горячем пути, поэтому было бы хорошо, если бы...
Я работаю над математической библиотекой, и мне хотелось бы иметь возможность преобразовать ее для использования новых интерфейсов INumber в System.Numerics. Приведенные здесь методы часто находятся на горячем пути, поэтому было бы хорошо, если бы...
public class ForeignKey {
public string Id {get;}
public TableA TableA {get;}
public TableB TableB {get;}
public static implicit operator string(ForeignKey obj){ return obj.Id; }
public override string ToString() { return...
Я создаю контейнер, используя перечисления в качестве индексов. Но я не могу найти способ инициализации основного массива, который сохраняет неявные преобразования. Вот код:
#include
#include
#include
Изучая C++, я наткнулся на утверждение, что конструктор и деструктор выполняют неявные вызовы new и delete операторы во время выделения памяти. Я не могу это правильно понять, так как, углубившись в это утверждение, я обнаружил, что операторы new и...