/ / Šablóna špecializácia s viacerými variadic šablóny - c + +, šablóny, c ++ 11, typetraits

Špecializácia šablón s viacerými šablónami variadic - c ++, šablóny, c ++ 11, typetraits

V mojom posledná otázka Dostal som veľkú pomoc pri získavaní špecializácie šablón na prácu. Teraz potrebujem trochu rozšírenie. Chcem pre tieto vyhlásenia dve špecializácie:

int main()
{
// First specialization
holder_ext<person> h1;
holder_ext<person, &person::age> h2;
holder_ext<int> h3;

// Second specialization
holder_ext<person, &person::age, &person::name> h4;
}

Moja osoba v triede vyzerá takto:

class person
{
private:
std::string name_;
int age_;
public:
person(const std::string &name)
: name_(name), age_(56)
{}
void age(int a) { age_ = i; }
void name(const std::string &n) { name_ = n; }
};

Zvláštnosťou je, že dvaja členoviafunkcie majú rôzne typy parametrov. Takže nemôžem použiť tú istú variadickú šablónovú funkciu člena pre oboch. Skúšal som to s dvoma rôznymi variadic šablónami. Ale to nefunguje. Taktiež predvolené hodnoty pre členské funkcie nefungujú.

Má niekto dobrý náznak pre mňa?

Toto je riešenie s jednou členskou funkciou (vďaka Pubby):

template < class T, void (std::conditional<std::is_class<T>::value, T, struct dummy>::type::* ...FUNC)(int)> class holder;

template < class T, void (T::*FUNC)(int)>
class holder<T, FUNC>
{
public:
explicit holder() : setter(FUNC) { std::cout << "funcn"; }
private:
std::function<void (value_type&, int)> setter;
};

template < class T>
class holder<T>
{
public:
explicit holder() { std::cout << "plainn"; }
};

Ďakujeme vopred!

P.S .: A nie, nevyšiel som za dva dni s "čo musí robiť s tromi, štyrmi, piatimi členskými funkciami"? ;-)

odpovede:

0 pre odpoveď č. 1

Pre úplne všeobecné riešenie by ste zasiahliproblém, ktorý sa nedá vyriešiť: Typ argumentu typu non-type šablóny nemožno odvodiť, takže musí byť explicitný v deklarácii šablóny, takže neexistuje žiadny spôsob, ktorým by ste šablóne mohli povedať, že chcete, aby každý argument pre viac ukazovateľov bol každý ktorý bude mať ešte neznámy typ.

Nehral som dosť s C ++ 11, ale vy ste mohli vyskúšať nútenie objednávania v argumentoch šablón členov a poskytnúť všetky podpisy v šablóne:

template <typename T,
void (std::conditional<...>::type*)(int),
void (std::conditional<...>::type*)(const std::string&)>

Opäť by to mohlo fungovať, alebo to nemusí ...


0 pre odpoveď č. 2

Nakoniec som našiel riešenie pre môj problém. Je to kombinácia medzi variadic šablóny a šablóny specilization: \ t

template < class T,
void (std::conditional<std::is_base_of<object, T>::value, T, struct dummy>::type::*FUNC1)(int) = nullptr,
void (std::conditional<std::is_base_of<object, T>::value, T, struct dummy>::type::* ...FUNC2)(const std::string&)
>
class holder_ext;

template < class T,
void (std::conditional<std::is_base_of<object, T>::value, T, struct dummy>::type::*FUNC1)(int),
void (std::conditional<std::is_base_of<object, T>::value, T, struct dummy>::type::*FUNC2)(const std::string&)
>
class holder_ext<T, FUNC1, FUNC2>
{
public:
holder_ext() { std::cout << "func 2 testn"; }
};

template < class T,
void (std::conditional<std::is_base_of<object, T>::value, T, struct dummy>::type::*FUNC1)(int)
>
class holder_ext<T, FUNC1>
{
public:
holder_ext() { std::cout << "func 1 testn"; }
};

Používam neimplementovanú deklaráciu a definujem dve špecializácie. Jeden s členskou funkciou a druhý pre všetky ostatné prípady.

Ak je lepšie riešenie dont "t váhať povedať mi."