Bu derler için optimize edilebilir. GCC'nin valarray
sinüs hesaplamasını geciktirmek için ifade şablonlarını kullanması gibi görünüyor. Ancak bu, sin
şablonunun dönüş türünü tam olarak valarray<T>
değil, biraz garip karmaşık tipte yapar.
#include <valarray>
template<typename T> struct id { typedef T type; };
int main() {
using std::valarray;
using std::sin;
id<__typeof__(sin(valarray<double>()))>::type (*fp)(const valarray<double> &) = sin;
}
Düzenleme: GCC yapıyor gayet niçin bakınız AProgrammer standart alıntı.
Düzenleme: kesinlikle Standart yere uyum şekilde __typeof__
yapılmadan gerçekleştirilmesi Standart uyumlu geçici çözüm
biraz zordur. sin
dönüş türünü almanız gerekir. Bunun için koşullu operatörü kullanabilirsiniz, Eric Niebler has shown. Gerçekte aramamış sin
işlevine sahip olarak çalışır, ancak yalnızca yazılır.
#include <valarray>
using std::valarray;
template<typename T> struct id {
typedef T type;
};
struct ded_ty {
template<typename T>
operator id<T>() { return id<T>(); }
};
template<typename E, typename T>
id<T(*)(valarray<E> const&)> genFTy(T t) {
return id<T(*)(valarray<E> const&)>();
}
template<typename T>
void work(T fp, id<T>) {
// T is the function pointer type, fp points
// to the math function.
}
int main() {
work(std::sin, 1 ? ded_ty() : genFTy<double>(std::sin(valarray<double>())));
}
: Diğer şube aynı tip koşullu operatör (aslında değerlendirilir bir) dönüştürmeye çalışırken, biz bir kukla parametresini üretebilir sadece fonksiyon kalem türünü anlamak mümkün Eğer adresi hemen almak istiyorsanız, work
yazarak tekrar fp
yazabilirsiniz.
template<typename T>
T addy(T fp, id<T>) { return fp; }
Şimdi, nihayet koşullu operatör hile kapsülleyen bir makro yazmak, ve bu tür bir matematik fonksiyonunun adresini almak istediğinizde kullanabilirsiniz.
#define DEDUCE(FN,Y) (1 ? ded_ty() : genFTy<Y>(FN(std::valarray<Y>())))
adresini alıp daha sonra
std::transform(v1.begin(), v1.end(), v1.begin(),
addy(std::sin, DEDUCE(std::sin, double)));
std::transform(v2.begin(), v2.end(), v2.begin(),
addy(std::cos, DEDUCE(std::cos, double)));
I yapar Aynı anda MacGyver benzeri bir yeteneğiniz ile bu problemin çözümünde bir koşullu operatörün bükülme kabiliyetinden etkilendim ve bunu yapmak gerektiğini dehşete düşürdüm. :) –
Vay canına, bunu anlamaya çalışmıyorum. ... –
@robert, bazı pa varsa soru sormaya çekinmeyin anlamıyorsun. Onlar için bir açıklama yapmaya çalışacağım o zaman. Ayrıca eric nieblers 'operatörünün kullanımını kullanımını açıkladığınızdan emin olun: burada: http://www.artima.com/cppsource/foreach2.html –