passare metodo con gli argomenti di template ad una macro
-
12-10-2019 - |
Domanda
Non sono in grado di utilizzare macro ASSERT_THROW()
di Google prova in combinazione con più argomenti di template. Si consideri che voglio fare in modo che la costruzione di Matrix<5,1>
getta:
ASSERT_THROW(Matrix<5,1>(), std::runtime_error);
(questo esempio non ha molto senso, naturalmente questo Shoud non buttare, ma è ciò che rimase dopo semplificando quello che avevo.)
ottengo questo output da MS VC ++ 2008:
warning C4002: too many actual parameters for macro 'ASSERT_THROW'
error C2143: syntax error : missing ',' before ';'
considerando che non ci sono problemi con:
ASSERT_THROW(Matrix<1>(), std::runtime_error);
Come posso superare questo problema?
Grazie!
Soluzione
il problema è la virgola in più, sarà necessario proteggerla dalla macro. Prova
ASSERT_THROW((Matrix<5,1>()), std::runtime_error);
Altri suggerimenti
#define COMMA ,
ASSERT_THROW(Matrix<5 COMMA 1>(), std::runtime_error);
Modifica @tletnes risposta è più semplice, tuttavia questo funziona anche se la macro parametro utilizzato come un non-espressione. Ad esempio:
BOOST_FOREACH(std::pair<int COMMA int>& v, myVec) { } // works
BOOST_FOREACH((std::pair<int, int>)& v, myVec) { } // fails
Più edit: La macro virgola è già definito in spinta:
#include <boost/preprocessor/punctuation/comma.hpp>
ASSERT_THROW(Matrix<5 BOOST_PP_COMMA() 1>(), std::runtime_error);
BOOST_FOREACH(std::pair<int BOOST_PP_COMMA() int>& v, myVec) { }
#define virgola, non può compilare in GCC. Utilizzare #define VIRGOLA (), invece. Perché non riesco ad aggiungere commentato il post di altri?