如何从模板g ++获取变量名

时间:2016-04-05 16:44:16

标签: c++ templates arduino g++

如何从中获取/打印变量名称?我正在使用arduino Stream打印到控制台。

#ifndef any_h
#define any_h

#if ARDUINO >= 100
 #include "Arduino.h"
#else
 #include "WProgram.h"
#endif

struct any {
  any(Stream& s):serial(s){}
  template <class T>
  void print(const T& msg)
  {
    getName(class T);
    serial.print(msg);
  }

  template <class A, class... B>
  void print(A head, B... tail)
  {
    print('{');
    print(head);
    print(tail...);
  }

  private:
    Stream& serial; 

};

#endif

用法:

any A(Serial);

int myInt =34;
float myFloat = 944.5555f;
String myString = " this string";
A.print(myInt,myFloat,myString);

当前输出

34944.555 this string

我正在尝试使用相同的用途/访问权限或类似内容:Demo

{"variableName":value,"variableName":value}
// That is in this case:
{myInt:34,myFloat:944.55,myString: this string}

我已经尝试过:

#define getName(x) serial.print(#x)
void print(const T& msg)
{  
   getName(msg);
   //getName(class T);
   serial.print(msg);
}
output : msg34msg944.555msg this string

2 个答案:

答案 0 :(得分:1)

您可以使用宏与stringify preprocessor结合使用:

代码:

#include <stdio.h>

#define PRINT_NAME(name) print_name(#name, (name))

void print_name(char *name, char* value) {
    printf("name: %s ---> value: %s\n", name, value);
}

int main (int argc, char* argv[]) {
    char* var1 = 'my var 1';
    char* var2 = 'my new var 2';

    PRINT_NAME(var1);
    PRINT_NAME(var2);

    return 0;
}

输出:

name: var1 --> value: my var 1
name: var2 --> value: my new var 2 

我希望这会有所帮助:)

答案 1 :(得分:0)

C ++没有反射,所以你只能使用宏,例如:

#include <iostream>
#define STRINGIFY_IMPL(X) #X
#define STRINGIFY(X) STRINGIFY_IMPL(X)
#define VARIABLE_NAME(X) STRINGIFY(X)
#define VARIABLE_VALUE(X) X

int main()
{
    double d = 3.141;
    std::cout << VARIABLE_NAME(d) << ": " << VARIABLE_VALUE(d) << '\n';
    return 0;
}

VARIABLE_NAMEVARIABLE_VALUE并非真正需要,您也可以使用std::cout << STRINGIFY(d) << ": " << d << '\n';)。

当然,您可以将这一切组合成一个超级宏(使用上面的宏):

#include <iostream>
#include <string>
#define STREAM_NAME_VALUE(str, X) str << '{' << STRINGIFY(X) << ':' << X << '}'

int main()
{
    int myInt =34;
    float myFloat = 944.5555f;
    std::string myString = " this string";

    STREAM_NAME_VALUE(std::cout, myInt);
    std::cout << '\n';
    STREAM_NAME_VALUE(std::cout, myFloat);
    std::cout << '\n';
    STREAM_NAME_VALUE(std::cout, myString);
    std::cout << '\n';
    return 0;
}