我有一个类:
class MyClass{
enum Choices : int
{
First,
Last
};
template<MyClass::Choices choice>
void bar(...);
};
我希望能够在客户端代码中对bar()
进行choice
模板调用。现在,因为我不希望客户端代码负责管理 MyClass
实例,所以我想添加另一个层来负责,这样我就可以:
{
t = new T();
t.bar<choice>();
};
在函数内部。
理想情况下,我希望能够调用这一层,我们称它为 foo()
,如下所示:
foo<MyClass::Choices::One>(...);
这可能吗?这是我尝试过但出现错误的方法:
template<typename T>
template<T::Choices choice>
void foo(){
t = new T();
t.bar<choice>();
};
最佳答案
我相信这是使用特征的想法所能做的最好的事情:
#include <iostream>
#include <type_traits>
template <typename T>
struct choice_traits;
class MyClass{
public:
enum Choices : int
{
First,
Last
};
template<MyClass::Choices choice>
void bar(...) {}
};
template <>
struct choice_traits<MyClass::Choices>
{
using parent = MyClass;
};
template <MyClass::Choices C>
using choice_const = std::integral_constant<MyClass::Choices, C>;
template <typename C, C value>
void foo(std::integral_constant<C, value>)
{
using T = typename choice_traits<C>::parent;
T* t = new T();
t->template bar<value>();
}
int main()
{
foo(choice_const<MyClass::Choices::First>());
return EXIT_SUCCESS;
}
您需要为每个具有选项枚举的容器类专门化 choice_traits
。我还创建了一个助手 choice_const
以避免直接使用 std::integral_constant
。
如果有更多信息,它可以改进,但根据您的解释,这是可以做到的。
关于C++: "Inferring"来自依赖类型的模板类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42819140/