c ++使用带有枚举class和重载转换运算符的模板函数

c++ Using a a template function with enum class and overloaded conversion operators

我正在阅读另一个 post Specializations only for C++ template function with enum non-type template parameter

上的示例代码

并且我试图更进一步,通过使用重载转换运算符来使用对象,就好像它是它的枚举成员一样调用模板函数。

//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

这最后一行不起作用,我正在尝试将转换后的对象放入模板中并调用特定于 A 所具有的类型的能力。我已经尝试了一些不同的东西,但似乎找不到我要找的东西,有没有正确的方法来做到这一点?

您的代码中的问题是您试图使用运行时值而不是编译时值来设置模板类型参数。

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

这是您的代码 运行 online,它指出了确切的问题。下次你对为什么你的模板类型没有被推导出错误感到困惑时 correctly/throwing 使用 constexpr 找出原因。

这是一个解释为什么 new 导致格式错误的 constexpr 的答案:C++14: can you call new in a constexpr?