3

関数型(パラメーター型と戻り型を含む)のテンプレートパラメーターを使用して関数を呼び出せるようにしたいのですが、関数内で型double(int, long)を分離して個別に使用します。

たとえば、関数を呼び出せるようにしたい

printRes<double(int, long)>();

上記のこの関数は、テンプレート引数を解析し、戻り値の型を抽出してdouble出力する必要があります。

クラスと可変個引数テンプレートを使用してこれを行う方法を知っています。

#include <iostream>
#include <typeinfo>

template <typename T>
class A {};

template <typename Res, typename... Args>
class A<Res (Args...)> { // Parse template argument
public:
    void printRes() {
        std::cout << typeid(Res).name() << std::endl;
    }
};

次に、次のように使用できます。

int main() {
    A<double(int, long)> a;
    a.printRes();
}

どの出力:

d

代わりに単純な関数を使用してこれを実行したいと思います。これは私が思いついたものです:

template <typename Res, typename... Args>
void printRes() {
    std::cout << typeid(Res).name() << std::endl;
}

ただし、代わりに次のようなテンプレートパラメータを指定する必要があります。

int main() {
    printRes<double, int, long>();
}

クラスバージョン(つまり)と同じテンプレートパラメータを使用して呼び出すことができるように関数を実装する方法はありますdouble(int, long)か?

4

1 に答える 1

3

私はあなたがほとんどそこにいると思います。関数テンプレート内で特性を使用できます。可能な実装は次のとおりです。

#include <iostream>
#include <typeinfo>

template <typename T>
struct A { };

template<typename Res, typename... Args>
struct A<Res (Args...)> 
{
    using type = Res;
};

template<typename T>
void printRes() 
{
    using Res = typename A<T>::type;
    std::cout << typeid(Res).name() << std::endl;
}

int main()
{
    printRes<double(int, long)>();
}

そして、これが実際の例です。

于 2013-03-09T19:30:49.673 に答える