假設我在檔案上有一個閱讀器類:
class Reader {
public:
template <class T>
T Read();
};
它的唯一功能是從檔案Read中讀取任何算術型別 ( static_assert(std::is_arithmetic_v<T>)) 的功能。現在我想創建該函式的特化,它從檔案中讀取一個向量。我將如何使用模板來做到這一點?像下面這樣的東西不起作用:
template <class T>
std::vector<T> Read<std::vector<T>>();
error: function template partial specialization is not allowed
std::vector<U> Read<std::vector<U>>();
^ ~~~~~~~~~~~~~~~~
uj5u.com熱心網友回復:
您不能部分專門化功能。你可以多載它們,但是這樣做的方式并不明顯,因為你的函式不帶任何引數。
首先,您需要一種方法來檢查型別是否為 a std::vector<??>:
template <typename T> struct IsVector : std::false_type {};
template <typename ...P> struct IsVector<std::vector<P...>> : std::true_type {};
然后您可以將其插入requires:
template <typename T>
T Read()
{
// Generic overload
}
template <typename T> requires IsVector<T>::value
T Read()
{
// Vector overload
}
或者,你可以有一個函式,if constexpr (IsVector<T>::value)里面有。
uj5u.com熱心網友回復:
實作您想要的一種方法是將成員函式的邏輯委托給幾個私有成員函式:
#include <cstdio>
#include <vector>
class BinaryReader {
public:
template <class T>
T Read() {
T t{};
this->ReadImpl(t);
return t;
}
private:
template <class T>
void ReadImpl(T& t) {
static_assert(std::is_arithmetic_v<T>);
std::puts("T");
t = T{}; // implement your logic here
}
template <class T>
void ReadImpl(std::vector<T>& t) {
std::puts("std::vector<T>");
t = std::vector<T>{}; // implement your logic here
}
};
int main() {
BinaryReader br;
br.Read<int>();
br.Read<std::vector<int>>();
}
這不需要您引入新的型別特征來檢查您的型別是否為std::vector<>. 但是,它要求您的回傳型別是默認可構造的。
輸出:
T
std::vector<T>
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467039.html
