Variadic pointer to member as template

Is there any workaround for this type of situation:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
struct Struct
{
    int member;
    int member2;
    char member3;
};

template<int Struct::*...pMembers>
void StructStuff()
{

}

template<typename... Args>
void StructStuff(Args Struct::*...pMembers)
{

}


int main()
{
    StructStuff<&Struct::member, &Struct::member2>();
    StructStuff(&Struct::member, &Struct::member2, &Struct::member3);
    return 0;
}


Basically a way to use pointer to member as template (rather then as argument) but allow for any type - not just int. Why?... No real reason yet. The 2nd way works fine for my use cases so far.
Last edited on
Ah I think I figured out a way to do this:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include "stdafx.h"

struct Struct
{
    int member;
    int member2;
    char member3;
};

template<typename T>
struct Wrapper 
{
    typedef T Struct::*PtrMember;
    PtrMember Value;
};

template <typename T>
auto Wrap(T Struct::*Value)
{
    return Wrapper<T>{Value};
}

template<typename... Args>
void StructStuff(Wrapper<Args...> wrappers...)
{

}

int main()
{
    StructStuff(Wrap(&Struct::member), Wrap(&Struct::member3));

    return 0;
}



Ah actually that's not too useful. The full pointer to member value is still not in a template.

Attempt 2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
struct Struct
{
    int member;
    int member2;
    char member3;
};

template<typename T, T Struct::*Value>
struct Wrapper 
{

};


template<typename... Args>
void StructStuff(Args... wrappers)
{

}

int main()
{
    StructStuff(Wrapper<int, &Struct::member>(), Wrapper<char, &Struct::member3>());

    return 0;
}


I think this covers everything apart from lack of deduction. The pointer to member value is on a templatable level so can spawn local statics specific to it. However, any way to make deduction work apart from with a macro (Macro would use decltype)?
Last edited on
It seems you want to deduce non-type template parameters from function arguments. This can't be done because compile-time decisions cannot depend on run-time parameters.

I'm not sure what the goal is, but if the problem was " allow for any type - not just int. ", you can deduce the types of the function parameters and decompose them:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template<class X> struct decompose;
template<class R, class S> struct decompose<R S::*> { using ret = R; };

template<class MFP>
void oneStructStuff(MFP mfp) {
    using R = typename decompose<MFP>::ret;
    std::cout << __PRETTY_FUNCTION__ << " return type is " << typeid(R).name() << '\n';
}

template<class... Args>
void StructStuff(Args... mpfs)
{
    std::cout << __PRETTY_FUNCTION__ << '\n';
    ( ... , oneStructStuff(mpfs)  );
}

int main()
{
    StructStuff(&Struct::member, &Struct::member3);
}


http://coliru.stacked-crooked.com/a/20bdeecda60aae8f
Last edited on
Topic archived. No new replies allowed.