我想做的是:
创建一个“InstructionSet”对象,
- 由其他地方的(指针的)容器泛型地(无需指定类型)保存
- 保持可变数量的指令对象(具有可能的重复类型),其类型满足概念“is_instruction_type”
- 具有“extract”函数,该函数生成包含单个特定类型的所有指令的新“InstructionSet”
我尝试通过在可变类上使用继承来实现这一点,这样递归就可以用来存储正确类型的每条指令;指向类型“InstructionSet<>”的指针可以在其上使用一个虚函数,以便能够访问继承的底部,并在对象上递归。
//Define recursively
template<typename...Args> requires (is_instruction_type<Args> && ...)
class InstructionSet;
//Base
template<>
class InstructionSet<>
{
public:
InstructionSet() {};
virtual ~InstructionSet() {};
template<typename U>
auto extract()
{
return extractHelper()->extract();
};
protected:
virtual InstructionSet<>* extractHelper();
};
//Recur
template<typename T, typename ...Rest> requires is_instruction_type<T>
class InstructionSet<T, Rest...> : public InstructionSet<Rest...>
{
public:
InstructionSet(T&& t, Rest&&...rest);
InstructionSet(T&& t, InstructionSet<Rest...>&& set);
virtual ~InstructionSet() {};
template<typename U> requires std::same_as<T, U>
auto extract();
template<typename U> requires !std::same_as<T, U>
auto extract();
virtual InstructionSet<T, Rest...>* extractHelper()
{
return this;
};
private:
T _instruction;
};
template<typename T, typename ...Rest> requires is_instruction_type<T>
inline InstructionSet<T, Rest...>::InstructionSet(T&& t, Rest&& ...rest) : InstructionSet<Rest...>(std::forward<Rest>(rest)...),
_instruction(std::forward<T>(t))
{
}
template<typename T, typename ...Rest> requires is_instruction_type<T>
inline InstructionSet<T, Rest...>::InstructionSet(T&& t, InstructionSet<Rest...>&& set)
{
_instruction = std::forward<T>(t);
std::construct_at((InstructionSet<Rest...>*)this, std::move(set));
}
template<typename T, typename ...Rest> requires is_instruction_type<T>
template<typename U> requires std::same_as<T, U>
auto InstructionSet<T, Rest...>::extract<U>()
{
return InstructionSet(_instruction, std::move(((InstructionSet<Rest...>*)this)->extract()));
}
template<typename T, typename ...Rest> requires is_instruction_type<T>
template<typename U> requires (!std::same_as<T, U>)
auto InstructionSet<T, Rest...>::extract<U>()
{
return ((InstructionSet<Rest...>*)this)->extract();
}
字符串
我有两个问题:
- 如何在多个模板下在类外部定义“extract”?
- 在部分专用化的类定义中应该如何处理类成员?(是否也应该包含完整的类定义?)
我尝试了不同的尖括号组合被包括/排除,以及试图将函数定义移动到类内部,但都抛出错误。
我想我理解了SFINAE的基本知识,对于带有类型定义和静态变量的类,但是对于更复杂的类,我感到困惑,似乎找不到很多例子。
2条答案
按热度按时间kcugc4gi1#
我认为您可以简化它,不进行专门化,而是使用
std::tuple
存储指令。首先使用一个helper函数来创建一个
std::index_sequence
,其中所有索引都在一个参数包中,类型为T
:字符串
然后,如果您将指令存储在
std::tuple
中,则提取可能如下所示:型
Demo
l7wslrjt2#
我想到了这个:
字符串
Demo