【问题标题】:Keep track of the last template function called跟踪最后调用的模板函数
【发布时间】:2023-02-21 16:18:19
【问题描述】:

现在:

template<typename T, typename... Args>
void init(Args&&... args);

template<typename T, typename... Args>
void run(Args&&... args);

...

// init() must be called before run()
// init() only needs to be called again if T or args change, e.g.

init<MyClass>(arg1, arg2);
run<MyClass>(arg1, arg2);
run<MyClass>(arg1, arg2);

init<MyClass2>(arg3, arg4, arg5);
run<MyClass2>(arg3, arg4, arg5);
run<MyClass2>(arg3, arg4, arg5);
run<MyClass2>(arg3, arg4, arg5);

init<MyClass>(arg1, arg2);
run<MyClass>(arg1, arg2);
...
// I do not know the order of these calls at compile time

我想创建一个为我处理 init() 的包装器,例如

template<typename T, typename... Args>
void runAndInit(Args&&... args) {
    if (T or args different from the last call) {
        init<T>(std::forward<Args>(args)...);
    }
    run<T>(std::forward<Args>(args)...);
}
...
runAndInit<MyClass>(arg1, arg2);
runAndInit<MyClass>(arg1, arg2);

runAndInit<MyClass2>(arg3, arg4, arg5);
runAndInit<MyClass2>(arg3, arg4, arg5);
runAndInit<MyClass2>(arg3, arg4, arg5);

runAndInit<MyClass>(arg1, arg2);
...

这可能吗?我更喜欢 C++11 解决方案,但如有必要,我会接受更高版本。

【问题讨论】:

  • 这个问题很不清楚。 init 函数的目的是什么?我不明白这是不是XY问题
  • with run 可以用于任何类或子集吗?

标签: c++ templates


【解决方案1】:

每个模板实例都是它自己的函数。所以你可以只使用一个静态函数范围变量:

bool mustReInit(int const* curr) {
  static int const* last = nullptr;
  return std::exchange(last,curr) != curr;
}
template<typename T, typename... Args>
void runAndInit(Args&&... args) {
  static int const identifier{}; // different for each instance
  if (mustReInit(&identifier)) {
    init<T>(args...); // do not forward here!
  }
  run<T>(std::forward<Args>(args)...);
}

【讨论】:

    猜你喜欢
    • 2018-10-26
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多