C++ 中的类型级函数

rpr*_*ero 1 c++ templates type-level-computation c++17

我目前正在上课

template <typename T, typename Context>
class Foo {
    T value;
    Context context;
}
Run Code Online (Sandbox Code Playgroud)

令人沮丧的是 的值T完全决定了 的值Context,因此第二项相当多余。在类似的情况下,我向类添加了一个Context类型,然后将函数编写为

template <typename T>
class Foo {
    T value; 
    T::Context context;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我在这里不能做同样的事情,因为 90% 的 foo 调用都在进行intdouble而且我无法修改类型。

是否可以编写一个类型级函数来获取我的初始类型并返回相关类型。我正在想象类似的事情。

template <typename T> typename FooContext;
using FooContext<int> = std::string;
using FooContext<NodeValue> = NodeValue::Context;

template <typename T>
class Foo {
    T value; 
    FooContext<T> context;
}
Run Code Online (Sandbox Code Playgroud)

作为一个额外的挑战,我们的项目是基于 C++17 的,因此不需要 C++20 概念的答案将被优先考虑。

Jar*_*d42 8

不直接使用别名,而是使用常规类,可以:

template <typename T> struct FooContext
{
    using type = typename T::Context;
};
template <> struct FooContext<int>
{
    using type = std::string;
};

// Other specialization as `double`.

template <typename T>
using FooContext_t = typename FooContext<T>::type;

template <typename T>
class Foo {
    T value; 
    FooContext_t<T> context;
};
Run Code Online (Sandbox Code Playgroud)

  • `std::conditional` 实例化双方:`std::conditional&lt;true, int, T::Context&gt;` 是错误的。不过,我们可能仍然有一个带有“Context”(而不是“type”)的“type_identity”,并延迟实例化。 (2认同)