3

このインターフェースの機能が欲しいです。

func<Type1,CompileOption>( Type2 value)
//or
func<Type1>( Type2 value)

最初のコンパイル時パラメーターは型です。すべての関数呼び出しで必要です。
2 番目のコンパイル時パラメーターはオプションです。の動作を変更するために使用されfuncます。
関数自体は、通常のパラメーターの型 ( Type2) に基づいてテンプレート化されています。

このようなインターフェイスを構築できますか?

できない場合、同様の動作を取得する方法はありますか? たとえば、コンパイル時の 2 つのパラメーターを受け取るテンプレート化された関数のように機能するもので、2 番目のパラメーターはオプションですか?

素朴なアプローチは機能しません。

// invalid syntax
template< typename Type1, typename CompileOption = Default, typename Type2>
void func( Type2 t2 );

// Does the wrong thing.
// CompileOption Parameter now change Type2.
template< typename Type1, typename Type2, typename CompileOption = Default>
void func( Type2 t2 );

//This kinda expresses what I'm looking for
template<typename Type2>
template<typename Type1, typename Optional = Default >
void func( Type2 t2 );
4

3 に答える 3

1

あなたはいつでも試すことができます

template<typename Type1, typename Optional = Default >
struct A
{
    template<typename Type2>
    void func( Type2 t2 ) {
        // function body
    }
};

多分これはあなたが必要とするものです。

于 2010-12-06T14:52:19.227 に答える
1

このようなことを意味しますか?

template<typename Type1, typename Type2, typename Option>
void foo (Type2 arg)
{
    ... code ...
}

template<typename Type1, typename Type2>
void foo (Type2 arg)
{
    foo<Type1, Type2, DefaultOption>(arg);
}

編集: 上記のスニペットは機能しますが、呼び出しで Type2 を明示的に指定する必要があるという欠点があります。

私は、これに対する適切な完全なテンプレート ソリューションを思いつかないことを認めなければなりません。私が得ることができる最も近いものは、空のメソッド引数を使用することでした:

struct DefaultOption { ... } DEFAULT;
struct OtherOption { ... } OTHER;

template<typename Type1, typename Type2, typename Option>
void foo (Type2 arg, Option)
{
    ... code ...
}

template<typename Type1, typename Type2>
void foo (Type2 arg)
{
    foo<Type1, Type2>(arg, DEFAULT);
}

これにより、フォームでの呼び出しが可能になります

foo<std::string>(1, DEFAULT);
foo<std::string>(1.0, OTHER);
foo<std::string>("Hello");

このパズルの本当の答えは何なのか興味があります。

于 2010-12-04T00:43:08.773 に答える
0

私は問題を考えすぎて、他のみんなも混乱させました。C ++ 0x拡張機能を使用しない限り、1つの関数を作成することはできません。ただし、2つのオーバーロードされた関数を使用して記述するのは非常に簡単です。

template< typename Type1, typename Option, typename Type2 >
void func( Type2 t2 )
{ /* ... */ }

template< typename Type1, typename Type2 >
void func( Type2 t2 )
{ func<Type1,Default,Type2>(t2); }

func<int,fast_t>(20.f);
func<float>(30); // uses Default as Option
func<float,Default>(30); //exact same call as above.
于 2010-12-07T01:26:41.500 に答える