c ++ Использование шаблонной функции с классом enum и перегруженными операторами преобразования - PullRequest
0 голосов
/ 30 ноября 2018

Я читал пример кода в другом посте Специализации только для шаблонной функции C ++ с параметром шаблона нетипичного типа enum

, и я пытаюсь сделать это еще на шаг,использование перегруженного оператора преобразования для использования объекта, как если бы он был его членом enum для вызова функции шаблона.

//in my .h
enum class AllowedTypes { Cat, Dog };

class A {
AllowedTypes animal;

public:
//constructor
A(AllowedTypes t): animal(t) {};
explicit operator AllowedTypes*() const { return (AllowedTypes*) animal; }
operator AllowedTypes() const { return animal; }
template <AllowedTypes type>
void ability() const;
}

//second class
struct B{
//tempalte function
template <AllowedTypes type>
void ability() const;
}

//in my cpp
template<>
void B::ability<AllowedTypes::Dog>() const
{
std::cout << "Dog ability." << std::endl;
}
template<>
void B::ability<AllowedTypes::Cat>() const
{
std::cout << "Cat ability." << std::endl;
}


//in my main
Class* a = new A(AllowedType(1))
Class* b = new B();

//this calls work!
b->ability<AllowedTypes::Cat>(); 

//trying to get the type and calling ability via conversion doesn't
AllowedTypes type = (AllowedTypes)*a; // this converts correctly!
b->ability<type>(); //does not call correctly

эта последняя строка не работает, я пытаюсь поместить преобразованный объект вшаблон и вызвать способность, специфичную для типа, который имеет А.Я пробовал несколько разных вещей, но не могу найти то, что искал, есть ли правильный способ сделать это?

1 Ответ

0 голосов
/ 30 ноября 2018

Проблема в вашем коде заключается в том, что вы пытаетесь установить параметр типа шаблона, используя значение времени выполнения, а не значение времени компиляции.

Class* a = new A(AllowedType(1)) // The call to new here makes 'type' below a runtime value

b->ability<AllowedTypes::Cat>(); // AllowedTypes::Cat can be supplied at compile time

AllowedTypes type = (AllowedTypes)*a; // this converts correctly!
b->ability<type>(); //does not call correctly

Вот ваш код, работающий онлайн которая указывает на точную проблему.В следующий раз, когда вы запутались в том, почему ваш тип шаблона не выводится правильно / выдает ошибку, используйте constexpr, чтобы выяснить, почему.

А вот ответ, объясняющий, почему new приводит к неправильной форме constexpr: C ++ 14: можете ли вы вызвать new в constexpr?

...