[英]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.