【发布时间】:2025-12-02 10:00:02
【问题描述】:
我有一个 C++ 问题。我想根据传递给它的模板化函数的类型参数生成一个类型。
让我举例说明。
class A {
template<class B> M() { }
void Z() {
// NOTE: Here I want to call to X on each type that was feed it to M.
X<N1>();
X<N1>();
...
X<NN>();
}
template<class B> X() { }
};
例如
A a;
a.M<int>();
a.M<double>();
然后a.Z() 执行...
X<int>();
X<double>();
另一个考虑唯一类型的示例
A a;
a.M<int>();
a.M<int>();
a.M<double>();
a.M<double>();
那么a.Z() 仍然会执行...
X<int>();
X<double>();
请注意,我是根据对 M 的调用生成类型 A。 好的!我认为对于那个 A 类,这在概念上是不可能的,因为 A 不是模板类型,然后它不能以这种方式变化,事实上,这对于 C++ 中的任何类型都是不可能的(我认为)。但我想让你明白。
我期待找到一种使用元编程来解决这个问题的方法,但欢迎任何建议、解决方案或参考。
【问题讨论】:
-
你为什么要这样做?
-
@ecatmur 我们在创建某些对象时使用通用编程和某种优化,我们需要以非常干净的方式清理资源
-
如果你想让
a.Z()在编译时扩展,问题是语句a.M<int>();和a.M<double>();在运行时是连续的,但在编译时完全不相关。A<int, double> a; a.Z();或A a; a.M<int, double>().Z();怎么样? -
这不能在编译时工作,因为在不同的翻译单元中可能有不同的实例化。如果将此限制为单个 TU,则可以使用 something like this。
-
为什么您认为以上方法可以很好地解决您的问题?在 C++11 中清理资源的干净方法是使用为您进行清理的 RAII 类型。看起来和上面的很不一样。
标签: c++ c++11 metaprogramming template-meta-programming