次のコードをコンパイルするにはどうすればよいですか?クラスとプリミティブ型のためにこのテンプレートクラスをコンパイルするにはどうすればよいですか?
私はそれがGetterFn
のための私のtypedefをコンパイルしようとするため、コンパイラはV<double>
に満足していないですが、私はGetterFn
とGetCalc()
は、クラスのために利用可能になりたい、しかし、プリミティブ型では無視することを実現しています。
このクラスをどのように再コードする必要がありますか?
#include <vector>
using namespace std;
class Bar
{
public:
float getMyFloat() const { return 42.5; }
};
template< typename T >
class V
{
public:
typedef float (T::*GetterFn)() const;
void getCalc(std::vector<double>& vec, GetterFn fn) const
{
vec.clear();
for (size_t i=0; i<m_v.size(); ++i)
vec.push_back(m_v[ i ].*(fn)());
}
private:
vector<T> m_v;
};
int main(int argc, char** argv)
{
V<Bar> vb; // ok
V<double> vd; // compiler not happy
}
私はあなたの答えをサンドボックスatmで試しています - 私は同意します - 私はKonradの答えがはっきりしているのが好きですが、私は渡す必要のあるメソッドポインタ(クラスのみ)を扱うtypedefが必要です。基本的には、クラス内でいくつかの作業を行うメソッドポインタを渡すことができるようにします。プリミティブはこのポインタを提供する必要はありません(全く意味をなさないので)、そのメソッドを持つべきではありません。 – kfmfe04
@ kfmfe04:私はその部分を理解しています。私が知らないことは、あなたのクラスが行う実際の仕事と、それが「T」が基本的であるかどうかに依存する方法です。実際の実装を書くときには、ある種のコンパイル時の分岐が必要になります。 –
クラスVは、実際には、インデックス型とデータ型を取る時系列クラスの非常に単純化されたバージョンです。データタイプは、基本的であっても非基本的であってもよい。非ファンダメンタルについては、私は呼び出し元が(プライベートデータメンバーを使用して)結果のベクトルを記入するために呼び出されるメソッドに名前を付けることを許可したいと思います。私は、発信者にデータの内部実装を心配させたくありません。 – kfmfe04