我想檢查一個模板類型並適當地調用一個函數。但是,這似乎並不奏效。我嘗試了is_same,C++ compile-time type checking,compile-time function for checking type equality和boost :: is_same。一切都給了我同樣的錯誤。以下是示例代碼。編譯時檢查模板類型C++
#include <iostream>
#include <type_traits>
using namespace std;
class Numeric
{
public :
bool isNumeric()
{
return true;
}
};
class String
{
};
template <class T>
class Myclass
{
private:
T temp;
public:
void checkNumeric()
{
if(std::is_same<T,Numeric>::value)
{
cout << "is numeric = " << temp.isNumeric();
}
else
{
cout << "is numeric = false" << endl;
}
}
};
int main()
{
Myclass<Numeric> a;
a.checkNumeric();
Myclass<String> b;
b.checkNumeric();
}
編譯上述代碼時,出現以下錯誤。
make all
Building file: ../src/TestCPP.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/TestCPP.d" -MT"src/TestCPP.d" -o "src/TestCPP.o" "../src/TestCPP.cpp"
../src/TestCPP.cpp:36:36: error: no member named 'isNumeric' in 'String'
cout << "is numeric = " << temp.isNumeric();
~~~~^
../src/TestCPP.cpp:51:4: note: in instantiation of member function 'Myclass<String>::checkNumeric' requested here
b.checkNumeric();
^
1 error generated.
make: *** [src/TestCPP.o] Error 1
在這種情況下,我既沒有字符串也沒有數字類。它來自第三方庫。我只實現MyClass,它將被打包爲另一個庫。我期望使用MyClass的應用程序將傳遞給我一個屬於第三方類的String或Numeric。 MyClass是一種專門的矩陣操作,密集/稀疏矩陣是來自第三方庫的數字和字符串類。我想檢查使用我的庫和第三方庫的應用程序是否正在根據屬於第三方庫的類類型調用MyClass。
請讓我知道如何解決這個問題。
我既沒有字符串或數字類。它來自第三方庫。我只實現MyClass,它將被打包爲另一個庫。使用MyClass的應用程序將傳遞給我一個屬於第三方類的String或Numeric。例如,String和Numeric類是來自第三方庫的密集和稀疏矩陣。我想檢查使用我的庫和第三方庫的應用程序是否正在根據屬於第三方庫的類類型調用MyClass。 –
@RamakrishnanKannan:這個答案只改變了'Myclass' –
只是要清楚,這可以使用SFINAE。關鍵是編譯器有兩個版本的'checkNumeric',如果其中一個產生了錯誤,那麼它將被默認地從考慮中刪除。 – Adam