2017-02-05 14 views
1

私は、続く可変数の引数を持つマクロの値を取得する方法は?

#include <iostream> 
#include <stdio.h> 
#include <tuple> 
using namespace std; 

class T { 
public: 
    string a; 
    string b; 
}; 

#define CONFIG_FUNCTION(...) int SetValue(T t){\ 
    int arg_len = tuple_size<decltype(make_tuple(__VA_ARGS__))>::value;\ 
    auto t = make_tuple(__VA_ARGS__);\ 
    int i = 0;\ 
    cout << arg_len << endl;\ 
    while (i < arg_len) {\ 
     // I need to get every value of __VA_ARGS__ 
     // t.a = "assigntment" 
    }\ 
    cout << get<1>(t) << endl;\ 
} 

CONFIG_FUNCTION("a", "b", "c", "d", "e"); 

int main() 
{ 
    T t; 
    SetValue(t); 
    return 0; 
} 

として引数の数( "A"、 "B"、 "C"、 "D"、 "E")は可変で、マクロ内の引数のすべての値を取得しようどうすれば値をトラバースできますか?

+1

あなたは本当に何をしようとしていますか?あなたのマクロは何も役に立たない、それがまだなくてはできないことを私が探します。また、実行時インデックスを持つ特定のタプル要素にアクセスすることもできません。むしろ 'std :: initializer_list'をチェックしてください。 –

+0

パラメータ "a" "b"をT.aのようなクラスTのメンバとして使う必要があります。変数として渡すことはできません。 – Titus

+0

だから、私は 'std :: initializer_list'を言及しています。また、今日は可変的なテンプレートパラメータを持っています。 –

答えて

0

引数の数( "a"、 "b"、 "c"、 "d"、 "e")は可変で、どのように値をトラバースできますか?

それはstd::tuple(またはそれをカプセル化するマクロ)を使用しているようだが(あなたが実際にやってみたいものは何でも)これを行うには間違ったアプローチです。あなたは、同じ型の引数の数が不明なお持ちの場合は、可変長引数テンプレートを使用することができるとき

std::vector<std::string> v1{"a", "b", "c", "d", "e"}; 
for(auto s : v1) { 
    // Handle every value contained in v1 
} 

std::vector<std::string> v2{"a", "b", "c", "d", "e", "f", "g"}; 
for(auto s : v2) { 
    // Handle every value contained in v2 
} 
0

なぜ可変引数マクロを使用するように

、あなたは単に、std::vector適切かつstd::initializer_listを使用することができますか? https://stackoverflow.com/a/25683817/2104697

:これを読んでどのように私 unpack変数作品、詳細情報は

#define CONFIG_FUNCTION(...) int setValue(){ return setValueImpl(__VA_ARGS__); } 

:あなたは本当にまだマクロを使用したいと思う場合

template<typename... Args> 
int setValueImpl(Args... args){ 
    constexpr auto arg_len = sizeof...(Args); 

    std::cout << arg_len << std::endl; 

    int unpack[] = {(static_cast<void>([](auto value){ 
     // value is equal to each arguments in args 
    }(args)), 0)..., 0}; 

    static_cast<void>(unpack); 
} 

その後、あなたはこのようにそれを宣言することができます

関連する問題