Wdrażam niektóre klasy do operacji algebry liniowej na bardzo małych wektorach o stałej wielkości i macierzach. currentY, kiedy zrobić:Automatyczne odlewanie w C++: niewłaściwe zachowanie dla klasy kontenerów
MyMathVector<int, 3> a ={1, 2, 3};
MyMathVector<double, 3> b ={1.3, 2.3, 3.3};
std::cout<<"First = "<<a+b<<std::endl;
std::cout<<"Second = "<<b+a<<std::endl;
Następnie First = {2, 4, 6}
i Second = {2.3, 4.3, 6.3}
, ponieważ drugi element jest lanego do pierwszego elementu typu przez kompilator. Czy istnieje "łatwy" sposób na zapewnienie tego samego rodzaju automatycznego castingu, jak w natywnym C++: int + double = double, double + int = double?
Dziękuję bardzo.
EDYCJA: Dzięki składni udzielonej z odpowiedzi, mam operatora + działa. Ale starałem następującej składni i kompilacja nie powiedzie się z powodu błędu: expected a type, got ‘std::common_type<T, TRHS>::type’
#include <iostream>
#include <type_traits>
template<class T> class MyClass
{
public:
MyClass(const T& n) : _n(n) {;}
template<class TRHS> MyClass<typename std::common_type<T, TRHS>::type> myFunction(const MyClass<TRHS>& rhs)
{
return MyClass<std::common_type<T, TRHS>::type>(_n*2+rhs._n);
}
T _n;
};
int main()
{
MyClass<double> a(3);
MyClass<int> b(5);
std::cout<<(a.myFunction(b))._n<<std::endl;
}
Jaki jest problem tej składni?
Great! Dla operatora + ta składnia działa dobrze, ale zawiesza się dla innych funkcji, które muszą być członkami klasy. Jaka jest składnia dla funkcji członka klasy, gdzie T jest typem klasy, a TRHS jest typem przekazywanego parametru? – Vincent
@Vincent odpowiednio edytował odpowiedź, najwyraźniej nie można wstawiać bloków kodu w komentarzach. –
Dziękuję bardzo. Zmieniłem oryginalne pytanie, ponieważ nie widzę błędu składni w dostarczonym kodzie ... – Vincent