4
4

2 に答える 2

1

あなたが達成しようとしていることは少し不明確です...一般に、これらすべてのメンバー関数をテンプレートにする正当な理由はありませんadder。引数として取る通常の関数にすることもできます。

このget関数は、実際にはを取得するのではなく、を追加するので、 を呼び出すことができますadd。関数呼び出し演算子はas 引数operator()()を取ることができます。int変換演算子 tointは、文字通りテンプレートとしては意味がなく、定義されたままでは呼び出すことができません。getとをテンプレートとして使用することを主張する場合は、次のようにoperator()呼び出すことができます。

C c(0);
c.get<5>(); // 5
c<5>();     // 5

しかし、私はあなたがデザインを再考し、本当に必要なものとテンプレートが進むべきかどうかを決定することをお勧めしますint. value、あなたは変換していませんが、別のものを作成していますint!)

于 2013-03-09T02:36:45.427 に答える
0

これは、あなたが尋ねなかった質問に対する答えです。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かなり近いです。

于 2013-03-09T01:40:27.413 に答える