C++: "Inferring"来自依赖类型的模板类型

标签 c++ templates

我有一个类:

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/

相关文章:

c++ - 模板链接器错误 : Undefined symbols (linker error), 但所有内容都在一个文件中

c++ - VC2017错误匹配模板类参数

c++ - 模板派生类中的错误 "Pure virtual function called"

c++ - 为什么当我们将 lambda 发送到 std::function 时,自动模板类型推导不起作用?

c++ - 当类型和名称位于不同行时,Vim 严重缩进 C/C++ 函数

c++ - 许多嵌套 std::conditional_t 的替代品?

jquery - 带有 CSS 布局模板模块的粘性页脚?

c++ - 如何在没有实现的情况下测试纯虚拟类?

c++ - 在 C++ 中接受不同数据类型的变量参数的函数

c++ - 容器与迭代器(多选)