【发布时间】:2021-06-14 13:04:05
【问题描述】:
这是我目前的程序:
#include <type_traits>
template<class Feature, class... FeatureList>
struct has_feature {
static constexpr bool value = (std::is_same_v<Feature, FeatureList> || ...);
};
template<class Feature, class... FeatureList>
inline constexpr bool has_feature_v = has_feature<Feature, FeatureList...>::value;
template<class Feature, class ...FeatureList>
static constexpr bool isConfiguredWith() {
return has_feature_v<Feature, FeatureList...>;
}
struct CanWalk {
};
struct CanNotWalk {
};
template<class... FeatureList>
struct Robot {
static auto configure() {
return Robot<WalkFeature < FeatureList...>>
();
}
private:
template<typename ...Config>
using WalkFeature =
std::conditional_t<isConfiguredWith<CanWalk, Config...>(), CanWalk, CanNotWalk>;
};
int main() {
Robot<CanWalk> robot_A = Robot<CanWalk>::configure();
Robot<CanNotWalk> robot_B = Robot<>::configure();
return 0;
}
基本上,Robot 是一个结构体,可以配置许多其他结构体(它们在此处用作标记),然后将Robot<T...>::configure() 修剪并组织传递给Robot 的模板参数。最后我们有:
Robot<CanWalk> robot_A = Robot<CanWalk, CanWalk>::configure();
Robot<CanNotWalk> robot_B = Robot<>::configure();
虽然重复的特征CanWalk作为模板参数传入,但在通过函数configure()构造Robot时,它们都被删除了。
在我将模板参数添加到功能 CanWalk 之前,这一直很好:
template <int Speed>
struct CanWalk {
};
现在一切都中断了,因为 CanWalk 不再是合法类型,它需要一个模板参数。
对于错误error: use of class template 'CanWalk' requires template arguments 发生自:
template<typename ...Config>
using WalkFeature =
std::conditional_t<isConfiguredWith<CanWalk>(), CanWalk, CanNotWalk>;
我该如何解决?
我如何将它们定义为:
Robot<CanWalk<5>> robot_A = Robot<CanWalk<5>>::configure();
Robot<CanNotWalk> robot_B = Robot<>::configure();
?
【问题讨论】:
-
您打算为功能添加更多参数吗?只有非类型参数,还是类型参数?
-
@463035818_is_not_a_number 目前只有 1 个,未来可能更多。这会有很大的不同吗?
-
如果类型参数和非类型参数混在一起,估计会很头疼。
-
김선달 所说的。如果您打算混合使用类型和非类型,可能值得考虑将它们全部设为类型参数并使用
std::integral_constant或类似的非类型 -
在某些时候,不管怎样,实际速度必须来自某个地方:程序必须提到,例如,
CanWalk<42>。这将在您的设计中发生在哪里以及如何发生?如果CanWalk只与假设的AnySpeed参数一起使用,则相当于根本不将其用作模板。
标签: c++ templates template-meta-programming