2013-05-02 2 views
4

JavaScript과 같이 많은 인수를 사용하여 함수를 오버로드 할 수 있습니까? 예를 들어 :C++에서 정의되지 않은 인수 수

function f() 
{ 
    alert(arguments[0]); 
} 

f(4); // will alert 4 

내가 C++에서 같은 일을 할 수 있습니까?

+1

가변 인수로 함수를 호출하고 싶습니까? 그렇다면 항상 가변 함수를 사용할 수 있지만이 페이지에서 말하는 것처럼 http://en.cppreference.com/w/cpp/utility/variadic'std :: initializer_list' 또는 '가변 템플릿'은 유형 안전하고 쉽게 사용할 수 있습니다. 용도. –

+0

죄송합니다. 제 예제에는 콜론이있어서 올바르게 컴파일되지 않았습니다. [데모] (http://ideone.com/uc3ZE5#view_edit_box)와 함께 새로운 편집을 참조하십시오. – 0x499602D2

답변

5

당신은 가변 인자 템플릿 인자와 튜플 사용할 수 있습니다

#include <tuple> 
#include <iostream> 

template <class... Args> 
void f(Args&&... args) 
{ 
    auto arguments = std::make_tuple(std::forward<Args>(args)...); 
    std::cout << std::get<0>(arguments); 
} 

void f() {} // for 0 arguments 

int main() 
{ 
    f(2, 4, 6, 8); 
} 
확인 바운드

Live Demo

을, 다음을 시도해보십시오 :

#include <tuple> 
#include <iostream> 

template <class... T> 
struct input 
{ 
    std::tuple<T...> var; 
    input(T&&... t) : var(std::forward<T>(t)...) {} 

    template <std::size_t N, bool in_range = 0 <= N && N < std::tuple_size<decltype(var)>::value> 
    auto get() -> typename std::tuple_element<in_range ? N : 0, std::tuple<T...>>::type 
    { 
     return std::get<in_range ? N : 0>(var); 
    } 
}; 

template <class... Args> 
void f(Args&&... args) 
{ 
    auto arguments = input<Args...>(std::forward<Args>(args)...); 

    std::cout << arguments.template get<9>(); 
} 

void f() {} // for 0 arguments 

int main() 
{ 
    f(2, 4, 6, 8); 
} 

업데이트 : 첫 번째가 필요한 경우 인수를 사용하면 첫 번째 인수를 se로 표시하는 함수를 원할뿐입니다. 매개 변수 팩에서 그것을 parating :이 만족스럽지 않은 경우 (즉, 당신은 n 번째 인수를 얻으려면)

template<class Head, class... Tail> 
void foo(Head&& head, Tail&&... tail); 

, 당신은 std::tuple<>에 인수를 풀고 std::get<> 인 요소 검색 할 수 있습니다

template<class... Args> 
void foo(Args&&... args) 
{ 
    auto t = std::forward_as_tuple(std::forward<Args>(args)...); 
    print(std::get<5>(t)); 
} 
+0

@shafikYaghmour 귀하의 질문은 다소 모호합니다. 특정 시나리오로 좁힐 수 있습니까? – 0x499602D2

+0

@ShafikYaghmour 'N'요소를 모두 얻으려면 루핑 형식을 사용해야합니다. 당신은 for (auto a : tup) print (a)'를 사용하여 범위 기반을 사용할 수 있습니다. 또한 템플릿 인수를 통해 컴파일 타임 상수를 사용할 수 있습니다. – 0x499602D2

+0

args를 하나의 특정 유형으로 강제 설정하는 방법이 있습니까? ('template int, T ... args) void f (T && ... args)') – Pharap

관련 문제