我正在阅读另一篇文章中的示例代码Specialization 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
这是您在线运行的代码,它指出了确切的问题。下次当你对为什么你的模板类型没有得到正确推导感到困惑/抛出错误时,请使用constexpr
来找出原因。
这里有一个答案解释了为什么new
会导致格式错误的constexpr
:C++14:你能在constexpr中调用new吗?