簡體   English   中英

C ++:從依賴類型“推斷”模板類型

[英]C++: “Inferring” template type from a dependent type

我有一堂課:

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 為了避免直接使用std::integral_constant我還創建了一個helper choice_const

如果有更多信息,可以對其進行改進,但這可以根據您的解釋進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM