テンプレートの引数に許容される値をいくつか受け入れるように関数テンプレートを制限するのは悪い方法ですか?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();
}
};
EDIT: 私の場合はこれです: 私はほとんど似ている2つの簡単な構造体AとBがあります。
struct A: public ICompress {
void compress() override {
next->compress();
}
ICompress *next;
};
struct B: public IDecompress {
void decompress() override {
next->decompress()
}
IDecompress *next;
};
を私の意図は、そのテンプレートを作成することでしたコンプレッサまたはデコンプレッサとしてインスタンス化する必要があります。
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には[concepts](https://en.wikipedia.org/wiki/Concepts_(C% 2B%2B))。その前にインスタンス化を選択する唯一の可能性はSFINAE(あなたの質問のように)です。 –
@HenriMenkeいいえ、C++ 17には概念がありません。 – cpplearner
短い答え:いいえ。いくつかの型には意味をなさないが他の型には意味のないテンプレートがある場合、他の型に対してインスタンス化されないようにするのが理にかなっています。たとえば、テンプレート化されたケーパビリティが数値型に対してのみ意味がある場合は、数値以外の型に対してインスタンス化されないようにします。その制限を強制する方法は、悪いスタイルかもしれません。たとえば、型が "数値"であるかどうかをコンパイル時にチェックする方法を指定します。 – Peter