C++ C++;:&引用;推断;依赖类型中的模板类型

C++ C++;:&引用;推断;依赖类型中的模板类型,c++,templates,C++,Templates,我有一门课: class MyClass{ enum Choices : int { First, Last }; template<MyClass::Choices choice> void bar(...); }; 函数内部 理想情况下,我希望能够调用此层,让我们将其称为foo(),如下所示: foo<MyClass::Choices::One>(...); foo(…); 这可能吗?这是我

我有一门课:

class MyClass{
    enum Choices : int
    {
        First,
        Last
    };
    template<MyClass::Choices choice>
    void bar(...);
};
函数内部

理想情况下,我希望能够调用此层,让我们将其称为
foo()
,如下所示:

foo<MyClass::Choices::One>(...);
foo(…);
这可能吗?这是我尝试过的,但出现了错误:

template<typename T>
template<T::Choices choice>
void foo(){
   t = new T();
   t.bar<choice>();
};
模板
模板
void foo(){
t=新的t();
t、 bar();
};

我相信这是你用特质这个概念所能做到的最好的:

#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;
}
#包括
#包括
模板
结构选择特征;
类MyClass{
公众:
枚举选项:int
{
第一,
最后
};
模板
空条(…){}
};
模板
结构选择特性
{
使用parent=MyClass;
};
模板
使用choice_const=std::integral_常量;
模板
void foo(标准::积分常数)
{
使用T=typename choice\u traits::parent;
T*T=新的T();
t->模板栏();
}
int main()
{
foo(choice_const());
返回退出成功;
}
您需要为每个具有选择枚举的容器类专门化
choice\u traits
。我还创建了一个helper
choice\u const
,以避免直接使用
std::integral\u constant


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

试试看。如果您遇到任何问题,请报告。@RSahu好吧,这显然是错误的<代码>它给了我:错误:“T::Choices”不是一种类型和
错误:模板参数列表太多
我喜欢这样。
#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;
}