gpt4 book ai didi

c++ - 是否可以通过模板方法在模板类上定义 typedef?

转载 作者:太空宇宙 更新时间:2023-11-04 13:09:40 25 4
gpt4 key购买 nike

假设我有一个这样的模板类:

template <typename T>
struct TypeInformation {
static int s_someArbitraryData;
}
template <typename T> TypeInformation<T>::s_someArbitraryData = 0;

然后,稍后我可以做这样的事情:

SomeFunction() {
SetUpData<int>(); // Populates s_someArbitraryData for int.
}

仅通过调用 SetUpData,我就为给定类型设置了一个 s_someArbitraryData 拷贝。如果可能的话,我想做的是做类似的事情,但设置一种映射类型的方法。像这样的东西,目前不起作用:

template <typename T>
struct MyTypeMap {}

// ...

SomeFunction() {
SetUpTypemap<int, float>(); // Creates a typedef on MyTypeMap<int>
MyTypeMap<int>::type myFloatValue = 1.0f; // A float value
}

我能做到 right now通过这样的事情:

template <>
struct MyTypeMap<int> {
typedef float type;
}

但这对我的情况有一些恼人的缺点。我怀疑我想要的是不可能的,但如果有一些我不知道的深层模板魔法可以解决这个问题,我也不会感到惊讶。

最佳答案

这可能离您要找的东西不远:

#include<type_traits>

template<typename T>
struct tag { using type = T; };

template<typename...>
struct MapPart;

template<typename T, typename U, typename... O>
struct MapPart<T, U, O...>: MapPart<O...> {
using MapPart<O...>::get;
static constexpr tag<U> get(tag<T>) { return {}; }
};

template<>
struct MapPart<> {
static constexpr void get();
};

template<typename... T>
struct Map: MapPart<T...> {
template<typename U>
using type = typename decltype(Map<T...>::template get<U>())::type;

template<typename U>
static constexpr auto get() {
return MapPart<T...>::get(tag<U>{});
}
};

int main() {
using MyTypeMap = Map<int, float>;
static_assert(std::is_same<MyTypeMap::type<int>, float>::value, "!");
MyTypeMap::type<int> myFloatValue = 1.0f;
}

最终语法略有不同。你有这个:

MyTypeMap::type<int>

取而代之的是:

MyTypeMap<int>::type

反正我觉得可以接受。

类型MyTypeMap仅在 using 声明的范围内可见。我认为这是原意 SetUpTypemap<int, float>功能:设置int之间的绑定(bind)和 float仅在函数内 SomeFunction .

通过使用这种方法,您的优势在于能够一次建立多个关系。
例如:

using MyTypeMap = Map<int, float, float, int>;

// ....

MyTypeMap::type<int> myFloatValue = 1.0f;
MyTypeMap::type<float> myIntValue = 1;

另请注意,为类型设置的第一个关系是最强的。
换句话说,如果您这样做:

using MyTypeMap = Map<int, float, int, char>;

类型MyTypeMap::type<int>将是 float它将隐藏 int 之间的关系和 char .

这不是一个完美的解决方案,但可能是解决您的问题的有效解决方案。

关于c++ - 是否可以通过模板方法在模板类上定义 typedef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40495595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com