我正在嘗試創建一個可以在成員元組中存盤函式的類。但是當試圖將 lambdas 放入物件的元組(通過函式指標)時,我收到了一個錯誤。請解釋一下,我做錯了什么以及發布這個想法的正確方法是什么。我認為應該有一個優雅且風格正確的通用解決方案(就函式式編程模式而言),以避免類描述、物件創建和用函式填充它們中的樣板代碼。
#include <functional>
#include <string>
#include <iostream>
template<typename... ArgTypes>
class MyClass {
public:
//boolean function of some argument
template<typename Type> using Func = bool(Type const &);
//type for a tuple of pointers to templated boolean functions
template<typename... Types> using TupleOfFunctions = typename std::tuple<Func<Types>*...>;
//the tuple
TupleOfFunctions<ArgTypes...> _tuple;
//constructor
MyClass(TupleOfFunctions<ArgTypes...> t) : _tuple(t) {
}
};
int main(int argc, char** argv) {
MyClass<int, std::string> M({
[](int &arg) { return arg > 0; },
[](std::string &arg) { return arg == "abc"; }
});
std::cout << (*std::get<0>(M._tuple))(1);
std::cout << (*std::get<1>(M._tuple))("xyz");
return 0;
}
我得到的錯誤是
./test.cpp:26:3: error: no matching function for call to 'MyClass<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::MyClass(<brace-enclosed initializer list>)'
26 | });
uj5u.com熱心網友回復:
template<typename Type> using Func = bool(Type const &);
這一行建議采用const型別引數的函式。然而:
[](int &arg) { return arg > 0; },
[](std::string &arg) { return arg == "abc"; }
這兩行建議非常量引數。
const從第一行中洗掉,或添加const到第二行中應該解決它。
但是,您能否提出一些重新設計類的想法,以便可以避免重復顯式宣告這些型別(在類模板規范和 lambda 函式引數中)的樣板代碼?
擁有 lambda 的部分原因是匿名函式型別。實際上,像你所做的那樣,試圖推斷其中的一種型別,有點倒退。
我建議這樣做的一種方法是:
template<typename ... Lambdas>
class MyClass {
public:
std::tuple<Lambdas...> _tuple;
MyClass(Lambdas ... args) : _tuple(std::make_tuple(args ...)) {
}
};
現在你可以像這樣使用它:
MyClass M(
[](const int &arg) { return arg > 0; },
[](const std::string &arg) { return arg == "abc"; }
);
或者,您可能對變體/訪問模式感興趣:https : //godbolt.org/z/5Pdn1Ynqe
uj5u.com熱心網友回復:
花括號初始化串列,如 {},實際上沒有型別。在模板推導的背景關系中,您只能在某些情況下使用它們 - 當針對 initializer_list(其中 T 是函式模板引數)進行推導時,或者當相應的引數已經被其他東西推導時。在這種情況下,這兩件事都不是真的 - 所以編譯器無法弄清楚 ...ArgTypes 應該是什么。
我認為您應該使用std::make_tuplelambda 作為函式指標并將其存盤。
活生生的例子
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/365032.html
上一篇:重復定義?[復制]
