0

私はこのコードを持っています:

class A
{
public:
    A(int _a, int _b = 0) : a(_a), b(_b) {}
    void f(){}
    #if _b == 0
    void g(){}
    #endif

private:
    int a;
    int b;
};

int main()
{
    A x(1);
    x.g();

    return 0;
}

bが0の場合にのみAにメソッドg()を持たせたい。上記のコードが機能しないことはわかっているが、これを実現する方法があるかどうかを知りたい。

4

3 に答える 3

2

いいえ。値は実行時にのみ認識されます。ただし、関数内の値をチェックして、近似をスローすることはできます。

于 2012-09-14T18:38:05.720 に答える
1

テンプレートを使用し、テンプレート引数(コンパイル時定数)として次元数を指定する必要があります。次に、特殊化を使用してさまざまなインターフェイスを提供します。

class Matrix_base {...};     // common code
template <int Dimensions>
struct Matrix;
template <>
struct Matrix<1> : Matrix_base {
    int operator[]( std::size_t idx ) const {
       // ...
    }
};
template <>
struct Matrix<2> : Matrix_base {
    int operator()( std::size_t idx1, std::size_t idx2 ) const {
       // ...
    }
}
// ...
Matrix<1> v( 10 );
std::cout << v[5];
// v(5,1)                  // error
Matrix<2> m( 10, 20 );
// std::cout << m[5];      // error
std::cout << m(5,1);
于 2012-09-14T18:55:08.243 に答える
0

いいえ、それは不可能です。b実行時にのみ認識されます。関数を呼び出してbゼロ以外の場合は、例外をスローすることをお勧めします。

void g()
{
   if(b == 0)
   {
      Exception e("error..."); // Your exception class or a std::exception class
      throw e;
   }

   // The code from here will not be executed
}
于 2012-09-14T18:44:14.340 に答える