【发布时间】: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 可以用于任何类或子集吗?