Шаблон со значением по умолчанию аргумента указателя метода

Рассмотрим этот специальный контейнерный класс, в котором хранятся типы, содержащие как ключ, так и значение.

template<typename K, typename T, K (T::*method)() const>
class Container
{
//...
};

K — тип ключа, T — тип значения, а указатель метода используется для извлечения ключа из значения.

Он отлично работает, но я хотел бы включить значение по умолчанию для указателя метода, чтобы, когда он не был указан вызывающей стороной, он был бы operator K() const таким:

template<typename K, typename T, K (T::*method)() const = &T::operator K const>

но это не компилируется, заявляя, что есть no member operator const K on A (<- my class I test this with), когда я пытаюсь его создать (и такой метод есть). Возможно ли вообще иметь значение по умолчанию для аргумента шаблона указателя метода? Если да, то каков правильный синтаксис?

РЕДАКТИРОВАТЬ: В дополнение к приведенному ниже решению существует «исправление» для случаев, когда T является указателем, который использует новую функцию С++ 11 std::remove_pointer<T>::type, поэтому:

template<typename K, typename T, K (std::remove_pointer<T>::type::*method)() const = &std::remove_pointer<T>::type::operator K>

person Resurrection    schedule 16.12.2015    source источник
comment
Идея в принципе верна. Это может быть просто вопрос правильного написания имени конкретной функции (функции преобразования).   -  person Kerrek SB    schedule 16.12.2015
comment
Вот здесь, может, убрать const?   -  person Kerrek SB    schedule 16.12.2015
comment
operator K const (== operator const K) будет функцией преобразования, ну, в общем, const K.   -  person T.C.    schedule 16.12.2015


Ответы (1)


Имя функции просто operator K. Его квалификация не является частью имени. Пытаться:

template <typename K,
          typename T,
          K (T::*method)() const = &T::operator K>
//                                 ^^^^^^^^^^^^^^
person Kerrek SB    schedule 16.12.2015
comment
Хорошая мысль: имя члена не содержит квалификаторы (или аргументы). Если необходимо устранить перегрузку, это необходимо сделать путем преобразования в подходящий указатель члена (который в данном случае легко доступен). - person Dietmar Kühl; 16.12.2015
comment
Правильно, конечно. Теперь это работает, за исключением случаев, когда я использую указатель на T в качестве аргумента. Я думаю, что специализация должна помочь с этим. - person Resurrection; 16.12.2015
comment
И я понял это для случаев, когда T также является указателем. Добавлено как редактирование в ОП. - person Resurrection; 16.12.2015