我想從std::ifstream
實現一些讀取功能。 它需要分開pod類型和其他類型。 (目前std::string
)如何正確設計和實現功能模板專業化?
template <typename T, typename = std::enable_if<std::is_pod<T>::value>::type>
T read(std::ifstream& fin);
template <>
std::string read<std::string, void>(std::ifstream& fin);
int main()
{
std::ifstream fin("test", std::ios::binary);
int x = read<int>(fin);
std::string str = read<std::string, void>(fin);
}
我想,當我調用讀爲std::string
從模板參數去掉「void
」。 我怎樣才能得到它?
在此先感謝。
更新(2017年9月14日)
我從EC++得到了提示,並試圖執行以下代碼。
template <bool B>
struct is_fundamental {
enum { value = B };
};
template <typename T>
static T doRead(std::ifstream& fin, is_fundamental<true>);
template <typename T>
static T doRead(std::ifstream& fin, is_fundamental<false>);
template <>
static std::string doRead<std::string>(std::ifstream& fin, is_fundamental<false>);
template <typename T>
static T read(std::ifstream& fin) {
return doRead<T>(fin, is_fundamental<std::is_fundamental<T>::value>());
}
int main()
{
std::string filename("./test.dat");
std::ifstream fin(filename, std::ios::binary);
read<int>(fin);
read<std::string>(fin);
read<std::vector<int>>(fin);
return 0;
}
爲每次讀取調用<>獲得正確的功能!
謝謝你的答案 – TwisTeDStRiDeR
@TwisTeDStRiDeR如果答案幫助了你,請考慮接受它。 – whoan
*「缺點是你必須以這種方式改變read()的調用」*。您可以繞過間接級別的缺點: 'template T read(std :: ifstream&fin){return my_read {}(fin); }(用正確的重命名)。 –
Jarod42