2

으로 기능 유형을 제외하고 당겨 분리 this question 추천 클래스 템플릿을 사용하여 기능 유형에 대한 대답은 : 여기 수행되고 있었는지 연구로전문 기능

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_args를 다시 작성했습니다. 나는 decltypeargs 템플리트에 대한 필요성을 없애기 위해 함수를 사용하여이 작업을 시도했습니다. 그러나 자신은 부적절한 구문에 빠져 발견 :

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

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

내 희망은 대신 decltypeargs<decltype(foo)>를 호출해야하는 tuple 유형을 얻을 수 decltype(myTry<decltype(foo)>())를 호출 할 수 있었다. 함수 선언으로이를 수행 할 수있는 방법이 있습니까?

+0

. 하지만 다른 질문을하고 싶습니다. 별로 나에게 명확하지 않습니다. – Arunmu

+0

@Arunmu 내 질문에 답한 것처럼 들리 네. 그러나 말씨를 개선하는 방법을 확신하지 못합니다. 함수의 반환과 인수를 따로 떼어 내려고 노력 중이며,이를 수행하기 위해 전문화를 사용해야합니다. 나는 그걸 기능으로하고 싶었지만 내가 할 수없는 것처럼 들린다. 그게 더 명확한가요? –

+0

무엇을 하려는지 확실하지 않습니다. 'myTry()'는 사용하지 않는 것보다 더 많은 타이핑을합니다 - 해결하려는 문제는 무엇입니까? – Barry

답변

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; 
} 
+0

어. 그게 바로 내가 할 수있는 방법을 모을 수 없었던 바로 그 기능입니다. 처음에는 제대로 할 수있을 때 누가 전문화가 필요합니까? –

+0

나는 여기에 다음 질문을했다 : http://stackoverflow.com/q/38482805/2642059 필자는 'decltype (m (foo))'이 어떻게 작동하는지 잘 파악하지 않아야한다고 생각한다. 메소드로 작업을 확장하십시오. –

+0

그건 해결 된 것 같습니다. :) –

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; 
} 
+0

하하, 나는 그것을 함수에서 성취한다고 생각합니다. 구조체를 함수로 바꾸기를 바랬다. [그래도 불가능한 것처럼 들리네] (http://stackoverflow.com/questions/38463980/pull-apart-function-type-with-specialized-function#comment64332056_38463980). 어쩌면 이것 대신 함수를 전문화 할 수 없다는 공식적인 소리를 인용 할 수 있습니다. –

+0

구조체를 대체 할 때 얻을 수있는 게 무엇인지 알지 못합니다. 그것은 컴파일 된 후 정확히 0 비트를 차지합니다. –

+0

당신은 완전합니다. 방금 함수 선언에 익숙해 져서 사용하려고했습니다. 그래서 대답은 간단합니다 : "당신은 그렇게 할 수 없습니다." 그러나 "내가 그렇게 말했기 때문에"다른 말을 인용해서 여기서 인용문을 얻을 수 있다면 좋을 것이다. –

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>{}); } 
+0

'태그'란 무엇입니까? –

+0

@ Cheersandhth.-Alf 그건 부분 전문화를 해킹하기 위해 그가 사용하고있는 것입니다. 근본적으로 이것은 나의 나쁜 질문이다. 분명히 옳은 대답은 구조체를 사용하는 것이다. 이것은 창의적인 해결 방법 일 뿐이다. –

+0

'myTry'의 2 가지 정의는'tag'없이 다른 오버로드가 될 것입니다. –