限制函數模板只接受模板參數的幾個允許值是否被認爲是不好的風格?在C++中限制允許的模板參數是否被認爲是不好的風格?
實施例:
template<typename T>
class Foo {
typename std::enable_if<std::is_same<Bar, T>::value, void>::type
callFuncInBar() {
BarGetValue();
}
typename std::enable_if<std::is_same<FooBar, T>::value, void>::type
callFuncInFooBar() {
FooBarGetValue();
}
};
編輯: 我的情況下是這樣的: 我有兩個簡單結構A和B幾乎是相似的:
struct A: public ICompress {
void compress() override {
next->compress();
}
ICompress *next;
};
struct B: public IDecompress {
void decompress() override {
next->decompress()
}
IDecompress *next;
};
我的目的是要建立一個模板,它應作爲Compressor或Decompressor實例化:
template<typename T>
struct codecomp: public T {
typename std::enable_if<std::is_base_of<ICompress, T>::value, void>::type
compress() {
next->compress();
}
typename std::enable_if<std::is_base_of<IDecompress , T>::value, void>::type
decompress() {
next->decompress();
}
T *next;
};
C++ 17將有[概念](https://en.wikipedia.org/wiki/Concepts_(C% 2B%2B))。在此之前,選擇實例化的唯一可能性是SFINAE(如你的問題)。 –
@HenriMenke不,C++ 17不會有概念。 – cpplearner
簡答:沒有。如果你有一個對某些類型有意義的模板,但對其他類型沒有意義,那麼防止它被其他類型實例化是有意義的。例如,如果模板化的功能僅對數字類型有意義,請阻止其爲非數字類型實例化。你如何執行這個限制可能會或可能不是壞風格。例如,如果您決定在編譯時檢查某個類型是否爲「數字」。 – Peter