2

この質問への答えは、クラス テンプレートを使用して関数型を分離します。

template <typename T>
struct function_args {};

template <typename R, typename... Args>
struct function_args<R(Args...)> {
    using type = tuple<Args...>;
};

template <typename T>
using decltypeargs = typename function_args<T>::type;

ここで何が行われているかを調べたので、書き直そうとしましたfunction_argsdecltypeargsテンプレートの必要性をなくすために、関数を使用してこれを実行しようとしました。しかし、不適切な構文に陥っていることに気付きました。

template <typename T>
tuple<> myTry();

template <typename Ret, typename... Args>
tuple<Args...> myTry<Ret(Args...)>();

私の希望は、 を呼び出すのではなく、型decltype(myTry<decltype(foo)>())を取得するために呼び出すことでした。関数宣言でこれを行う方法はありますか?tupledecltypeargs<decltype(foo)>

4

3 に答える 3

3

関数を使用すると、以前と同じ型特性を再利用できます。

template <typename T>
function_args<T> myTry();

または、関数を使用して同じものを再実装できます。関数テンプレートを部分的に特殊化することはできませんが、次のようにオーバーロードできます。

namespace detail {
    template <class T> struct tag { };

    template <class R, class... Args>
    tag<std::tuple<R, Args...>> myTry(tag<R(Args...)> );

    template <class R, class C, class... Args>
    tag<std::tuple<R, Args...>> myTry(tag<R(C::*)(Args...)> );        

    // etc.
}

template <typename T>
auto myTry() { return detail::myTry(detail::tag<T>{}); }
于 2016-07-19T16:54:05.957 に答える
2
//------------------------ Machinery:
#include <tuple>

template< class Ret, class... Args >
std::tuple<Args...> m( Ret(Args...) );

//------------------------- Example:
#include <iostream>
#include <typeinfo>

void foo( double );

using namespace std;
auto main()
    -> int
{
    using Args_tuple = decltype( m( foo ) );
    cout << typeid( Args_tuple ).name() << endl;
}
于 2016-07-19T17:21:45.603 に答える
1

関数をそのように特殊化することはできませんが、このために関数を特殊化する必要はありません。gcc 6.1.1 でテスト済み:

#include <iostream>
#include <tuple>

template <typename T> struct my_try;

template <typename Ret, typename... Args>
struct my_try<Ret(Args...)> {

    std::tuple<Args...> operator()();

};

template<typename T>
auto MyTry()
{
    return my_try<T>()();
}


void foo(int, char);

int main()
{
    decltype(MyTry<decltype(foo)>()) t;

    int *a= &std::get<0>(t);
    char *b= &std::get<1>(t);

    return 0;
}
于 2016-07-19T16:45:24.300 に答える