Получение класса C++ называет программно

Вы можете сделать что-то подобное с Perl, например :

echo 10,20,999| perl -ple 's/(\d+)/$1*10/ge'
100,200,9990

, что не удастся с отрицательными числами и экспонентами, поэтому вам нужно лучшее регулярное выражение, чтобы указать, как ваши числа могут выглядеть. Я не эксперт по регулярным выражениям, но что-то вроде этого мне кажется, по крайней мере, близким:

echo ":{0, 16, 0.0187782, 0.053621, 0.0045498, 3.2744e-05}:" | perl -ple 's/([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)/$1*10/ge'

:{0, 160, 0.187782, 0.53621, 0.045498, 0.00032744}:

Если у кого-то есть лучшее регулярное выражение, пожалуйста, скажите, что я обновлю.

Если ваши данные находятся в файле, вы можете сделать:

perl ... < file.dat
54
задан Cœur 23 March 2017 в 06:01
поделиться

2 ответа

Вы можете использовать typeid :

#include <typeinfo>
cout << typeid(obj).name() << endl;

Однако это не рекомендуется, поскольку формат не стандартизирован и может различаться между разными компиляторами (или даже разными версиями одного и того же компилятор).

88
ответ дан 7 November 2019 в 07:47
поделиться

Что относительно этого,

Протестированный в Windows 10 с помощью Visual Studio 2019 (v142).

#include <iostream>
#include <typeinfo>
#include <string>

/**
 @author    blongho
 @fn        template<typename Object> std::string classNameOf()

 @brief     Determine the class name of an object

 @tparam    Object  Type of the object.

 @returns   A name of the class
 @date      2019-09-06
 */

template<typename Object>
std::string classNameOf() {
    std::string name = typeid(Object).name(); //* user defined types gives "class Type"*\ 
    size_t spacePosition = name.find_first_of(" ");
    if (spacePosition != std::string::npos) {
        return name.substr(spacePosition + 1, name.length());
    }
    return name; // mostly primitive types
}


class Person {
private:
    /* data */
public:
    Person() {};
    ~Person() {};

};

class Data
{
private:
    /* data */
public:
    Data() {};
    ~Data() {};

};

struct Type {};

int main() {
    std::cout << "Class name of Person() is \"" << classNameOf<Person>() << "\"\n";
    std::cout << "Class name of Data() is \"" << classNameOf<Data>() << "\"\n";
    std::cout << "Class name of Data() is \"" << classNameOf<Type>() << "\"\n";
    std::cout << "Class name of double is \"" << classNameOf<double>() << "\"\n";
    std::cout << "Class name of std::string is \"" << classNameOf<std::string>() << "\"\n";
    std::cout << "Class name of int is \"" << classNameOf<int>() << "\"\n";
    std::cout << "Class name of float is \"" << classNameOf<float>() << "\"\n";
    std::cout << "Class name of char is \"" << classNameOf<char>() << "\"\n";
    return 0;
}
<час>

Output

Class name of Person() is "Person"
Class name of Data() is "Data"
Class name of Data() is "Type"
Class name of double is "double"
Class name of std::string is "std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >"
Class name of int is "int"
Class name of float is "float"
Class name of char is "char"

В Ubuntu 18.04,

g++ -o test src/main.cpp
./test
Class name of Person() is "6Person"
Class name of Data() is "4Data"
Class name of Data() is "4Type"
Class name of double is "d"
Class name of std::string is "NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE"
Class name of int is "i"
Class name of float is "f"
Class name of char is "c"
0
ответ дан 7 November 2019 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: