我對C++模板語法有些不穩定,所以我不確定我想象的是否可能,如果是,對正確的語法不清楚。模板函數檢查「is int」/「is double」/ etc
我想實現像template<int> bool is(std::string&)
,template<double> bool is(std::string&)
等模板函數,這樣我可以打電話is <int> (...)
或is <double> (...)
代替isInt(...)
或isDouble(...)
,等這可能嗎?如果是這樣,你將如何編寫函數簽名?
隨着我的模板語法的微妙把握,我的嘗試是:
#include <iostream>
#include <cstdlib>
template<int>
bool is(std::string& raw)
{
if (raw.empty()) return false;
char* p;
int num = strtol(raw.c_str(), &p, 10);
return ((*p != '\0') ? false : true);
}
int main(int argc, char* argv[])
{
std::string str("42");
std::cout << std::boolalpha << is <int> (str) << std::endl;
return 0;
}
這失敗,出現以下錯誤:
>g++ -g main.cpp
main.cpp: In function ‘int main(int, char**)’:
main.cpp:16:51: error: no matching function for call to ‘is(std::string&)’
std::cout << std::boolalpha << is <int> (str) << std::endl;
^
main.cpp:5:6: note: candidate: template<int <anonymous> > bool is(std::string&)
bool is(std::string& raw)
^
main.cpp:5:6: note: template argument deduction/substitution failed:
非類型模板參數需要*值*不是類型。我建議你閱讀[* template specialization *](http://en.cppreference.com/w/cpp/language/template_specialization)。 –
你可能會很快得到答案,但我的建議只是「不要」。它使用與模板相關的語法對代碼進行混淆,只有這樣您才能在調用站點上獲得一點點語法糖。 – StoryTeller
@StoneThrowThrow對不起,第一條評論只是一個誤解,刪除它;) – user463035818