任意の型をタイプセーフにカプセル化できる型を作ろうとしています。私はこの答えからこれが可能かもしれないという考えを頭の中で思いつきました:5年後、「可能な限り最速のC ++デリゲート」よりも優れたものはありますか?これまでのところ、問題の解決に成功しただけですが、原因が見つからないというエラーが発生しました。
コンパイラは、値を値自体の型にキャストできないと言っているようです。これは奇妙なことです。
llvm-gcc 4.2(gcc 4.2.1フロントエンド)でMac OSX10.6を実行しています。
ボイド*を取り除く方法や、重要性の低い位置に移動する方法の提案は歓迎されますが、この質問は実際にはそれに関するものではありません。
エラー:
$ g++ main.cpp
main.cpp: In static member function ‘static Stamp StampFactory<T>::make(T*) [with T = int]’:
main.cpp:33: instantiated from ‘Stamp makeStamp(T*) [with T = int]’
main.cpp:39: instantiated from here
main.cpp:26: error: could not convert template argument ‘t’ to ‘int*’
コード:
typedef void (*VoidFunc)(void*);
struct Stamp
{
Stamp(VoidFunc p)
{
this->press = p;
}
VoidFunc press;
};
template<typename T>
struct StampFactory
{
template<T* rvalue>
struct Pattern
{
void operator()(void* lvalue)
{
*dynamic_cast<T*>(lvalue) = *rvalue;
}
};
static Stamp make(T* t)
{
return Stamp(Pattern<t>()); // 28
}
};
template<typename T>
Stamp makeStamp(T* t)
{
return StampFactory<T>::make(t); // 33
}
int main(int argc, char** argv)
{
int i = 0;
Stamp s = makeStamp(&i); //39
}