2011-06-30 17 views
3

とテンプレート関数をラップ:は、私がboost.pythonを使ってPythonにC++関数以下を公開しようとしているboost.python

template <typename genType> 
    genType refract(
     genType const & I, 
     genType const & N, 
     typename genType::value_type const & eta); 

とどのような私が得たことはこれです:

template<typename N> 
    N reflect(N const & i, N const & n, typename N::value_type const & eta) 
    { 
     return glm::N refract(i,n,eta); 
    } 

BOOST_PYTHON_MODULE(foo) 
{ 
    def("reflect", reflect<float>); 
    def("reflect", reflect<double>); 
} 

エラーC2780:「無効ブースト::のpython ::デフ(のconst char型*、F、constのA1 &、constのA2 &、constのA3をコンパイルするとき、私は次のエラーを持っています) ':5つの引数が必要です - 2が提供されます

どうすればよいですか?

-----編集------

これは動作します:

template<class T> 
T floor(T x) 
{ 
    return glm::core::function::common::floor(x); 
} 

BOOST_PYTHON_MODULE(busta) 
{ 
def("floor", floor<double>); 
def("floor", floor<float>); 
} 

を参照から、floor()定義はfolowingです:

template< typename genType > 
genType floor (genType const &x) 

私が構築することができますこれはDLLとして、それをPythonでインポートし、そこからfloor()を使用します。人生はとてもいい感じ...しかし...

これは動作しません、と私は理由を理解したいと思います:

template<class genType > 
genType reflect (genType i, genType n, genType eta) 
{ 
    return glm::core::function::geometric::refract(i, n,eta); 
} 

BOOST_PYTHON_MODULE(busta) 
{ 
def("reflect", reflect<float>); 
} 

レフラクト()の定義は、この記事の一番上にあります。

私は今取得エラーはこれです:

1>foo.cpp(37): error C2893: Failed to specialize function template 'genType glm::core::function::geometric::refract(const genType &,const genType &,const genType::value_type &)' 
1>   With the following template arguments: 
1>   'float' 
1>   foo.cpp(60) : see reference to function template instantiation 'genType 
`anonymous-namespace'::reflect<float>(genType,genType,genType)' being compiled 
1>   with 
1>   [ 
1>    genType=float 
1>   ] 
1> 
1>Build FAILED. 
+1

最初に、浮動小数点型に型定義された名前の「value_type」があるとしたらどうですか? –

+0

@Darkこれは確かに問題でしたが、これが唯一の問題だと思いますか? –

+1

私は分かりません。私はこの機能が何をしようとしているのか理解していません。これまで行ってきたことは、 'value_type'の問題をテンプレートの1つ上のレベルにさらに移動させました。 'genType 'が何であれ、それは浮動または二重にすることはできません。ネストされた型名 'value_type'を持つ必要があります。通常これは 'genType'が標準C++のコンテナまたはイテレータでなければならないことを意味します。 –

答えて

2

それは型システムを悪用して、追加のグルーコードの多くを書く必要ですので、これは完璧な答えではありません。
呼び出し元の関数(リフレクション)を満たすのに必要なtypedefを持つように、ターゲット型を飾るためのラッパーテンプレートを定義することができます。

この例は、このようなアプローチの失敗を示しています。このリフレクション関数は単純な加算を実行することに注意してください。しかし、C++がテンプレート型Nの演算子+を認識するためには、ラッパーは明示的にそれを定義しなければなりません。

#include <iostream> 
using namespace std; 

template<class N> 
N reflect(const N& n, const typename N::value_type& t) 
{ 
    return n + t; 
} 

template<class N> 
struct wrapper 
{ 
    typedef N value_type; 

    wrapper(const N& n):_n(n){} 
    operator N&() { return _n; } 
    N operator+ (const N& r) const { return _n + r; } 

    N _n; 
}; 

int main(int,char**) 
{ 
    cout << reflect(wrapper<double>(1), 2.0) << endl; 
    return 0; 
} 
関連する問題