В моем примере ниже показано, что неявные преобразования из типов без шаблонов в типы шаблонов не будут работать так же легко, как те, которые включают только типы без шаблонов. Есть ли способ заставить их работать, тем не менее?Неявное преобразование в шаблон
Пример:
struct point;
template<unsigned d> struct vec {
vec() { }
// ...
};
template<> struct vec<2> {
vec() { }
vec(const point& p) { /* ... */ } // Conversion constructor
// ...
};
struct point {
operator vec<2>() { return vec<2>(/* ... */); } // Conversion operator
};
template<unsigned d> vec<d> foo(vec<d> a, vec<d> b) {
return vec<d>(/* ... */);
}
template<unsigned d1, unsigned d2>
vec<d1 + d2> bar(vec<d1> a, vec<d2> b) {
return vec<d1 + d2>(/* ... */);
}
int main(int argc, char** argv) {
point p1, p2;
vec<2> v2;
vec<3> v3;
foo(v2, p1);
foo(p2, v2);
foo(p1, p2);
bar(v3, p1);
}
Есть ли способ, чтобы этот код автоматически конвертировать из point
в vec<2>
?
Я знаю, что может привести к перегрузке foo
и bar
для обеспечения point
аргументов, делегируя в vec
реализации с использованием явного преобразования. Но делать это для всех комбинаций параметров станет утомительным, особенно для функций со многими такими параметрами. Поэтому мне не нужны решения, в которых я должен дублировать код для каждой комбинации параметров каждой функции.
Похоже, что ни конструктор преобразования, ни оператор литья не являются достаточными для достижения этого. По крайней мере, мои gcc 4.7.1 сообщает no matching function call
, хотя он именовал желаемую функцию в уведомлении, заявив, что ‘point’ is not derived from ‘vec<d>’
.
Какая строка дает эту ошибку? Кроме того, 'unsigned' не является типом C++. – 2013-02-22 06:59:20
@James: Ошибки сообщаются для строк с вызовами функций, хотя в примечаниях упоминаются и другие другие строки. Не стесняйтесь копировать и компилировать код выше, поскольку он является автономным. В разделе 3.9.1 из [стандарта C++ 11] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf) имена 'unsigned', поэтому почему это не тип C++, который используется совместно с C? – MvG
Нет, он объявляет 'unsigned char',' unsigned short int', 'unsigned int',' unsigned long int' и 'unsigned long long int' как неподписанные целые типы. – 2013-02-22 07:08:26