C++:从依赖类型"Inferring"模板类型

C++: "Inferring" template type from a dependent type

本文关键字:类型 Inferring 依赖 C++      更新时间:2023-10-16

我有一个类:

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

如果有更多的信息,可以改进,但根据您的解释,这是可以做的。