вывод шаблона класса из указателя на член

В качестве одного из параметров шаблона класса мне нужно использовать указатель на член:

template <class Base, typename Member, Member Base::*m>
class MemPtrTestUgly
{
...
};

Это нужно использовать как

struct S
{
    int t;
}

MembPtrTestUgly <S, int, &S::t> m;

Но я хочу использовать его так:

MemPtrTestNice<S, &S::t> m;

Тип члена выводится из указателя члена. Я не могу использовать шаблон функции, так как класс MemPtrTest не должен быть создан (будут использоваться только некоторые статические функции). Есть ли способ сделать это на чистом С++ 03 (без Boost или TR1)?


person Adam Trhon    schedule 14.02.2012    source источник
comment
Я сомневаюсь, что это возможно с C++03.   -  person iammilind    schedule 14.02.2012


Ответы (1)


Вы можете использовать частичную специализацию и получить довольно красивую реализацию:

template <typename TMember, TMember MemberPtr>
class MemPtrTest;

template <typename TBase, typename TType, TType TBase::*MemberPtr>
class MemPtrTest<TType TBase::*, MemberPtr>
{
    // ...
};

Это будет использоваться как:

MemPtrTest<decltype(&S::t), &S::t> m;

Конечно, для этого требуется decltype или эквивалент, если вы не хотите неявно указывать тип члена.

person John Calsbeek    schedule 14.02.2012
comment
decltype находится в С++ 11. Другой вариант, typeof, предназначен только для gcc. Есть ли другие варианты? - person Adam Trhon; 14.02.2012
comment
Чтобы иметь значение в качестве параметра шаблона, вы должны иметь возможность создать тип этого значения в списке параметров шаблона. Наиболее вероятным обходным решением является контекст, в котором C++ может вывести тип из обычного значения, что в основном сводится к самостоятельной реализации decltype. - person John Calsbeek; 14.02.2012
comment
Вы можете создать экземпляр этого класса внутри вспомогательной функции, используя вывод аргумента шаблона, но это не поможет вам, если вы хотите назвать сам класс. - person John Calsbeek; 14.02.2012