T
Aufgrund eines Tipps habe ich etwas mit Boost Parameter experimentier um Designated Initializers aus C99 in C++ zu ersetzen. Das funktioniert auch bei trivialen stucts sehr schön, aber eine !:1 Ersetzung bestehenden Codes ist mir noch nicht gelungen, da da noch das ein oder andere nicht funktioniert. Folgendes Beispiel ist ein (zur Anschauung reduziertes) Codefragmend bei dem ich den Umbau versucht habe.
#include <iostream>
#include<boost/parameter/keyword.hpp>
#include<boost/parameter/name.hpp>
#include<boost/parameter/parameters.hpp>
#include <boost/parameter/preprocessor.hpp>
#include <cstdint>
BOOST_PARAMETER_NAME(Idx)
BOOST_PARAMETER_NAME(Ip)
BOOST_PARAMETER_NAME(SrcNet)
union tIpAdr
{
uint32_t U32;
uint16_t U16[2];
uint8_t U8[4];
};
struct tSyslogTab_impl
{
uint8_t Idx[4];
tIpAdr Ip;
char SrcNet[17];
template <typename ArgumentPack>
tSyslogTab_impl(const ArgumentPack& args):Idx(args[_Idx]),Ip(args[_Ip]),SrcNet(_SrcNet){}
};
struct tSyslogTab : tSyslogTab_impl
{
BOOST_PARAMETER_CONSTRUCTOR(
tSyslogTab, (tSyslogTab_impl), tag,
(required (Idx,(uint8_t[4])))
(required (Ip,(tIpAdr)))
(required (SrcNet,(char[17])))
) // no semicolon
};
static const tSyslogTab tSyslogTabSetupDFT[] =
{
{
_Idx = {'0','0','0','1'},
_Ip = {U32:0},
_SrcNet = "Intranet",
},
{
_Idx = {'0','0','0','2'},
_Ip = {U32:0},
_SrcNet = "Intranet",
},
};
Als Fehlermeldung kommt:
/home/andreas/projects/Test2/main.cpp:43:34: warning: deducing ‘const T’ as ‘const std::initializer_list<char>’ [enabled by default]
/usr/include/boost/parameter/keyword.hpp:58:5: warning: in call to ‘const typename boost::parameter::aux::tag<Tag, const T>::type boost::parameter::keyword<T>::operator=(const T&) const [with T = std::initializer_list<char>, Tag = tag::Idx, typename boost::parameter::aux::tag<Tag, const T>::type = boost::parameter::aux::tagged_argument<tag::Idx, const std::initializer_list<char> >]’ [enabled by default]
/home/andreas/projects/Test2/main.cpp:43:34: warning: (you can disable this with -fno-deduce-init-list) [enabled by default]
/home/andreas/projects/Test2/main.cpp:44:24: warning: deducing ‘const T’ as ‘const std::initializer_list<int>’ [enabled by default]
/usr/include/boost/parameter/keyword.hpp:58:5: warning: in call to ‘const typename boost::parameter::aux::tag<Tag, const T>::type boost::parameter::keyword<T>::operator=(const T&) const [with T = std::initializer_list<int>, Tag = tag::Ip, typename boost::parameter::aux::tag<Tag, const T>::type = boost::parameter::aux::tagged_argument<tag::Ip, const std::initializer_list<int> >]’ [enabled by default]
/home/andreas/projects/Test2/main.cpp:44:24: warning: (you can disable this with -fno-deduce-init-list) [enabled by default]
/home/andreas/projects/Test2/main.cpp:48:33: warning: deducing ‘const T’ as ‘const std::initializer_list<char>’ [enabled by default]
/usr/include/boost/parameter/keyword.hpp:58:5: warning: in call to ‘const typename boost::parameter::aux::tag<Tag, const T>::type boost::parameter::keyword<T>::operator=(const T&) const [with T = std::initializer_list<char>, Tag = tag::Idx, typename boost::parameter::aux::tag<Tag, const T>::type = boost::parameter::aux::tagged_argument<tag::Idx, const std::initializer_list<char> >]’ [enabled by default]
/home/andreas/projects/Test2/main.cpp:48:33: warning: (you can disable this with -fno-deduce-init-list) [enabled by default]
/home/andreas/projects/Test2/main.cpp:49:23: warning: deducing ‘const T’ as ‘const std::initializer_list<int>’ [enabled by default]
/usr/include/boost/parameter/keyword.hpp:58:5: warning: in call to ‘const typename boost::parameter::aux::tag<Tag, const T>::type boost::parameter::keyword<T>::operator=(const T&) const [with T = std::initializer_list<int>, Tag = tag::Ip, typename boost::parameter::aux::tag<Tag, const T>::type = boost::parameter::aux::tagged_argument<tag::Ip, const std::initializer_list<int> >]’ [enabled by default]
/home/andreas/projects/Test2/main.cpp:49:23: warning: (you can disable this with -fno-deduce-init-list) [enabled by default]
/home/andreas/projects/Test2/main.cpp:52:1: error: could not convert ‘{(& {anonymous}::_Idx)->boost::parameter::keyword<T>::operator= [with T = std::initializer_list<char>, Tag = tag::Idx, typename boost::parameter::aux::tag<Tag, const T>::type = boost::parameter::aux::tagged_argument<tag::Idx, const std::initializer_list<char> >]((* & std::initializer_list<char>(((const char*)(& ._104)), 4ul))), (& {anonymous}::_Ip)->boost::parameter::keyword<T>::operator= [with T = std::initializer_list<int>, Tag = tag::Ip, typename boost::parameter::aux::tag<Tag, const T>::type = boost::parameter::aux::tagged_argument<tag::Ip, const std::initializer_list<int> >]((* & std::initializer_list<int>(((const int*)(& ._105)), 1ul))), (& {anonymous}::_SrcNet)->boost::parameter::keyword<T>::operator= [with T = char [9], Tag = tag::SrcNet, typename boost::parameter::aux::tag<Tag, const T>::type = boost::parameter::aux::tagged_argument<tag::SrcNet, const char [9]>]((*"Intranet"))}’ from ‘<brace-enclosed initializer list>’ to ‘tSyslogTab’
/home/andreas/projects/Test2/main.cpp:52:1: error: could not convert ‘{(& {anonymous}::_Idx)->boost::parameter::keyword<T>::operator= [with T = std::initializer_list<char>, Tag = tag::Idx, typename boost::parameter::aux::tag<Tag, const T>::type = boost::parameter::aux::tagged_argument<tag::Idx, const std::initializer_list<char> >]((* & std::initializer_list<char>(((const char*)(& ._106)), 4ul))), (& {anonymous}::_Ip)->boost::parameter::keyword<T>::operator= [with T = std::initializer_list<int>, Tag = tag::Ip, typename boost::parameter::aux::tag<Tag, const T>::type = boost::parameter::aux::tagged_argument<tag::Ip, const std::initializer_list<int> >]((* & std::initializer_list<int>(((const int*)(& ._107)), 1ul))), (& {anonymous}::_SrcNet)->boost::parameter::keyword<T>::operator= [with T = char [9], Tag = tag::SrcNet, typename boost::parameter::aux::tag<Tag, const T>::type = boost::parameter::aux::tagged_argument<tag::SrcNet, const char [9]>]((*"Intranet"))}’ from ‘<brace-enclosed initializer list>’ to ‘tSyslogTab’
Ich habe schon viel an den Initialisierungswerten herumgebastelt, bekomme das aber nicht zum Kompilieren. Hat da jemand einen Tipp.