所以我有這個類:
template <typename callBackOne,
typename callBackTwo>
class MyClass { // The class
public:
callBackOne cbo;
callBackTwo cbt;
MyClass(callBackOne cbop, callBackTwo cbtp){
cbop();
cbtp();
}
};
它所做的只是呼叫您在引數中為其建構式提供的函式。回呼函式型別由模板推匯出來。我不能以任何其他方式做到這一點。為什么我嘗試時會出錯:
MyClass<void,void> test(voidFuncOne,voidFuncTwo);
錯誤:
error: invalid parameter type ‘void’
no matching function for call to ‘MyClass<void, void>::MyClass(int (&)(), void (&)())’
24 | MyClass<void,void> testy(test,testTwo);
我嘗試了很多不同的東西,包括:
MyClass<void(&)(),void(&)()> test(test,testTwo);
MyClass<void,void> test(&test,&testTwo);
MyClass<void (*)(void),void (*)(void)> test(test,testTwo);
我知道它可以像這樣將函式作為引數傳遞,但我不知道如何。這是語言知識的問題。
uj5u.com熱心網友回復:
問題是您傳遞的顯式模板引數是型別但void函式引數voidFuncOne,并且voidFuncTwo將被隱式轉換為void (*)()并傳遞,但是由于沒有從 avoid(*)()到void您的轉換,您會得到提到的錯誤。
C 17
使用 C 17,您可以使用類模板引數推導(又名 CTAD),如下所示:
template <typename callBackOne,
typename callBackTwo>
class MyClass { // The class
public:
callBackOne cbo;
callBackTwo cbt;
MyClass(callBackOne cbop, callBackTwo cbtp){
cbop();
cbtp();
}
};
void voidFuncOne()
{
std::cout<<"funcone called"<<std::endl;
}
void voidFuncTwo()
{
std::cout<<"functow called"<<std::endl;
}
MyClass test(voidFuncOne,voidFuncTwo); //CTAD used automatically here
//-----^------------------------------->no need to pass arguments explicitly since CTAD will be used
演示
C 17 之前
在這里,您可以顯式指定模板引數的型別void(*)(),如下所示:
template <typename callBackOne,
typename callBackTwo>
class MyClass { // The class
public:
callBackOne cbo;
callBackTwo cbt;
MyClass(callBackOne cbop, callBackTwo cbtp){
cbop();
cbtp();
}
};
void voidFuncOne()
{
std::cout<<"funcone called"<<std::endl;
}
void voidFuncTwo()
{
std::cout<<"functow called"<<std::endl;
}
//------vvvvvvvvv--vvvvvvvvv--------------------------------->template arguments changed from void to void(*)()
MyClass<void(*)(), void(*)()> test(voidFuncOne,voidFuncTwo);
演示
uj5u.com熱心網友回復:
類成員cbo,cbt似乎沒用:它們沒有在MyClass的建構式中分配,根本沒有使用。
如果你想保存函式指標供以后使用,你可以嘗試std::function在<functional>. 這是一個例子:
#include <iostream>
#include <functional>
template <typename callBackOne, typename callBackTwo>
class MyClass { // The class
public:
std::function<callBackOne> cbo;
std::function<callBackTwo> cbt;
MyClass(callBackOne cbop, callBackTwo cbtp) : cbo(cbop), cbt(cbtp) {
}
};
void voidFuncOne() { std::cout << "One\n"; }
void voidFuncTwo() { std::cout << "Two\n"; }
int main()
{
MyClass<void(), void()> test(voidFuncOne, voidFuncTwo);
test.cbo();
test.cbt();
return 0;
}
uj5u.com熱心網友回復:
模板類的引數型別是void,但是建構式的引數型別不是void型別,這是錯誤的根本原因。
嘗試以下操作:
MyClass<int(), void()> test(voidFuncOne,voidFuncTwo);
或者
MyClass<decltype(voidFuncOne),decltype(voidFuncTwo)> test(voidFuncOne,voidFuncTwo);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/473684.html
