我很少有一個模板函式的實體。它們中的每一個都按順序執行每個給定的 lambda,并伴隨著特定的訊息。當我使用一個 lambda 執行此操作時,一切正常,但是當我嘗試添加多個時,我得到
note: candidate template ignored: deduced conflicting types for parameter 'Task'
從鏗鏘。這是我的代碼:
template <class Task> void doTasks(Task task1) // works fine
{
if (std::__is_invocable<Task>::value)
{
std::cout << "doing first task" << endl;
task1;
}
}
template <class Task>
void doTasks(Task task1, Task task2) // deduced conflicting types
{
if (std::__is_invocable<Task>::value)
{
std::cout << "doing first task" << endl;
task1();
std::cout << "doing second task" << endl;
task2();
}
}
int main()
{
doTasks([&] (){std::cout << "1" << endl;});
doTasks([&] (){std::cout << "1" << endl;},
[&] (){std::cout << "2" << endl;});
return 0;
}
它出什么問題了?我該如何處理我的問題?
對不起,如果這是一個愚蠢的問題,我是 C 的初學者,可能不理解一些模板的細微差別。
uj5u.com熱心網友回復:
盡管兩個傳遞的 lambda 做相同或看起來相似,但它們具有完全不同的型別。因此,您需要在doTasks.
簡單的解決方法是為兩個 lambdas 提供模板引數
template <class T1, class T2>
void doTasks(T1 task1, T2 task2)
{
// ...
}
否則,使用可變引數模板函式和折疊運算式,您可以執行以下操作:
#include <type_traits> // std::conjunction_v, std::is_invocable
template <class... Ts>
void doTasks(Ts&&... lmds) {
if (std::conjunction_v<std::is_invocable<Ts>...>) // maybe if constexpr
{
(lmds(), ...);
}
}
由于引數是可變引數,它也適用于單個/任何引數,doTasks因此沒有代碼重復。
現場演示
uj5u.com熱心網友回復:
lambda 有不同的型別。您需要為第二個添加另一個模板引數:
#include <type_traits> // for the proper `std::invocable`
template <class Task, class AnotherTask>
void doTasks(Task task1, AnotherTask task2) {
if constexpr (std::is_invocable_v<Task> && std::is_invocable_v<AnotherTask>) {
std::cout << "doing first task\n";
task1();
std::cout << "doing second task\n";
task2();
}
}
注意:由于它是 C 17,因此您也可以使用constexpr if來處理if僅在編譯時。
演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/496355.html
上一篇:陣列C 的除錯模板
