Re: Passing pointer-to-member as arguments in variadic template.
{ Please limit your text to fit within 80 columns, preferably around 70,
so that readers don't have to scroll horizontally to read each line.
This article has been reformatted manually by the moderator. -mod }
Tirsdag den 28. oktober 2014 19.20.12 UTC+1 skrev ???? Tiib:
On Monday, 27 October 2014 16:30:14 UTC+2, peter koch larsen wrote:
Den mandag den 27. oktober 2014 07.40.17 UTC+1 skrev ??? Tiib:
On Monday, 27 October 2014 02:40:11 UTC+2, peter koch larsen wrote:
What I would like to do is something like
template<typename T,typename... Args> void g(T& t)
where each arg is a pointer-to-member.
That can't be because pointer to member is not type, it is value.
You have to specify type of those to have a variadic list.
Something like:
template<typename T,int T::*... Mpis> void g(T& t)
Yes, this is the core problem. Perhaps some sort of duck-typing would
solve that?
If you insists on types then that should compile (disclaimer, I just
turned off brain):
#include <iostream>
// pointer to member
template<typename T,typename Q,Q T::*mpi>
struct Ptm { static constexpr Q T::* value = mpi; };
Yes, I have been that on the same road. ;-)
int main()
{
Person somePerson = { "Robin Hood", "Sherwood Forest", 0.0};
// call g
g< Person
, Ptm<Person, std::string, &Person::name>
, Ptm<Person, std::string, &Person::address>
, Ptm<Person, double, &Person::salary>
>( somePerson );
std::cout << 42 << std::endl;
}
[snip]
I still feel that something involving the style of tuple is more
elegant than my no-brain example. Not sure about beauty. :)
I can sketch I have so far (and decided to live with it unless I stumble
over something better):
A template class:
template<class T,class... Q> struct member_info;
Which essentially stores a list of member-pointers.
A helper-function:
template<class T,class... Args>
member_info<T,Args...>
create_member_info(Args... args)
Why did I not call that function make_member_info? Should probably correct.
And finally a traits class:
template<typename T,typename MemberInfo,const MemberInfo& mi> traits
That one is actually a specialisation of a generic traits-class I have -
and also includes other info.
My program contains houndreds of classes that are more or less
automatically generated from an external specification (Several
specifications in ASN.1 style).
Mostlu, I just need to input and output these classes and for that I
use a std::tuple inspired interface (when I started this program about
a year ago, not all compilers could cope with the number of template
arguments I had to support - some of the elements contained more than
200 sub-elements).
The tuple-like style supports my visitor-concept and is perfect most
of the time, but sometimes I have to write "real" code - and here it
gets a bit cumbersome and rather errorprone to write code using get<>.
Using my new visitor traits is not ideal, but at least I can declare
the much used elements in "standard" C++ and still use my templated
utilities, mainly for I/O in different forms (a GUI and serialisation),
Just hoped for something a bit more elegant.
Thank you for your help!
/Peter
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]