stu*_*e06 1 c++ traits constexpr c++11
我正在尝试实现基于特征的策略子系统,但是我有一个我真的不知道该如何解决的问题(如果可能的话)。我的特征看起来像这样:
template <typename ValueT, typename TagT = void, typename EnableT = void>
struct TPolicyTraits
{
static void Apply(ValueT& value) { }
};
Run Code Online (Sandbox Code Playgroud)
这个特征可以这样专门化:
struct MyPolicy {};
template <typename ValueT>
struct TPolicyTraits<ValueT, MyPolicy>
{
static void Apply(ValueT& value) { /* Implementation */ }
};
Run Code Online (Sandbox Code Playgroud)
我想在编译时以某种链表的形式注册策略。策略系统将像这样使用:
namespace PolicyTraits
{
template <typename ValueT, typename TagT>
using TPolicyTraitsOf = TPolicyTraits<std::decay_t<ValueT>, TagT>;
template <typename ValueT>
void Apply(ValueT&& value)
{
// todo iterate through constexpr tag list and apply policies
}
template <typename TagT>
constexpr void Enable()
{
// todo add tag to constexpr list
}
}
int main()
{
PolicyTraits::Enable<MyPolicy>();
PolicyTraits::Apply(std::string());
}
Run Code Online (Sandbox Code Playgroud)
有什么办法可以做到这一点?
编译时元编程大部分是纯粹的。这意味着每个表达式的结果由其参数确定。
坦白地说,通过使用依赖于参数的查找和好友函数以及SFINAE可以解决此问题。
不要那样做
从策略中构建策略特征类,不要四处寻找全局状态。
TL; DR在技术上是可行的,但是这是一个可怕的想法。不要这样
与您描述的问题相邻的问题可能是干净而优雅的解决方案。