2 に答える
あなたが達成しようとしていることは少し不明確です...一般に、これらすべてのメンバー関数をテンプレートにする正当な理由はありませんadder
。引数として取る通常の関数にすることもできます。
このget
関数は、実際にはを取得するのではなく、を追加するので、 を呼び出すことができますadd
。関数呼び出し演算子はas 引数operator()()
を取ることができます。int
変換演算子 toint
は、文字通りテンプレートとしては意味がなく、定義されたままでは呼び出すことができません。get
とをテンプレートとして使用することを主張する場合は、次のようにoperator()
呼び出すことができます。
C c(0);
c.get<5>(); // 5
c<5>(); // 5
しかし、私はあなたがデザインを再考し、本当に必要なものとテンプレートが進むべきかどうかを決定することをお勧めしますint
. value、あなたは変換していませんが、別のものを作成していますint
!)
これは、あなたが尋ねなかった質問に対する答えです。enable_if
暗黙のキャスト演算子でSFINAE操作を実行し、クラス自体のテンプレート引数に応じてそれらを有効または無効にする方法です。
#include <iostream>
#include <type_traits>
template<int n>
struct Foo {
template<typename T,typename=typename std::enable_if<std::is_convertible<T,int>::value && (n!=0)>::type>
operator T() const { return n; }
};
int main() {
Foo<0> zero;
Foo<1> one;
int x = 0;
x = one;
int y = 0;
// y = zero; -- does not compile, because Foo<0> cannot be converted to int
std::cout << x << "," << y << "\n";
}
これは完全ではありませんis_convertible
。暗黙の型変換のホスト全体を生成することを意味しますが、比較的近いです。
テンプレート引数をキャスト演算子に渡す方法、または少なくともそれを概算する方法は次のとおりです。
template<int n>
struct int_wrapper {
int i;
operator int() const { return i; }
int_wrapper( int i_ ):i(i_) {}
};
// in class C:
template<int adder> operator int_wrapper<adder>() { return i_ + adder; }
int_wrapper
ここでは、intパラメータをパッケージ化するおもちゃのタイプを作成しました。このintパラメータは、テンプレートパラメータをに明示的に渡すことを許可する以外は、完全に使用されていませんoperator int_wrapper<n>
。を返すことint_wrapper<...>
は、の完全な代替ではありませんが、int
かなり近いです。