2009-10-20 6 views
1

inline Prétendument std :: inner_product() ne sont pas inline avec le compilateur gcc < gcc 4.1 compilateurs, par la bug suivante.Inlining std :: inner_product

Par conséquent, je voudrais mettre en œuvre ma propre version de inner_product. Est-ce que existe déjà?

Merci

+1

Le lien est rompu. –

+0

Aghh, fixé il ... – vehomzzz

+0

Suis-je manque quelque chose, ou dit le troisième message (http://www.mail-archive.com/[email protected]/msg200159.html) que c'était patché? –

Répondre

2

Vous avez juste besoin de regarder dans vos fichiers d'en-tête C++ de, trouver la définition, et de redéfinir avec le mot-clé « en ligne » (peut-être dans votre espace de noms). Par exemple, en regardant mes têtes:

template <class T1, class T2, class T> inline T inner_product(T1 first1, T1 last1, T2 first2, T init) 
{ 
    for (; first1 != last1; ++first1, ++first2) init = init + *first1 * *first2; return init; 
} 
1

Les implémentations évidentes ressemblerait à quelque chose comme ceci:

// warning: untested code: 
template <class I1, class I2, class T> 
T inline inner_product(I1 s1, I1 e1, I2 s2, T i) { 
    while (s1!=e1) { 
     i = i + ((*(s1)) * (*(s2))); 
     ++(s1); 
     ++(s2); 
    } 
    return i; 
} 

template <class I1, class I2, class T, class B1, class B2> 
T inline inner_product(I1 s1, I1 e1, I2 s2, T i, B1 b1, B2 b2) { 
    while (s1!=e1) { 
     i=b1(i, b2(*(s1), *(s2))); 
     ++(s1); 
     ++(s2); 
    } 
    return i; 
} 

L'utilisation de ces identifiants courts est probablement discutable, mais pour le code comme celui-ci qui vit dans un en-tête afin ses compilé une fois gazillion, les identifiants courts de gagner du temps ... L'analyse syntaxique