将函数指针类型转换为相应的字符串

时间:2019-07-18 17:07:52

标签: c++ templates c++14

还没有读过有关C ++模板的书,所以我陷入了一个问题。我正在使用C ++ 14。

如何根据类型本身将函数指针类型转换为特定的字符串? 我有函数指针类型:

    using FuncType1 = int (*)(double);
    using FuncType2 = int (*)(int);
    using FuncType3 = int (*)(int);

我想写这样的东西:

class Test {
private:
   template<FuncType1> static const std::string func_name = "FuncType1";
   template<FuncType2> static const std::string func_name = "FuncType2";
   template<FuncType3> static const std::string func_name = "FuncType3";
public:
   template<T> std::string GetFuncType() {
      return func_name<T>::value;
   }
};

我知道这不能编译,但足以显示想法。我认为可以专门化GetFuncType方法,但是我更喜欢专门化成员变量func_name(如果可能的话)。另外-如果代码固定,FuncType2和FuncType3能否解析为正确的字符串?

2 个答案:

答案 0 :(得分:2)

一种方法:

template<class T> constexpr char const* get_name() = delete;

using FuncType1 = int (*)(double);
using FuncType2 = int (*)(int);

template<> constexpr char const* get_name<FuncType1>() { return "FuncType1"; }
template<> constexpr char const* get_name<FuncType2>() { return "FuncType2"; }

int main() {
    std::cout << get_name<FuncType1>() << '\n';
    std::cout << get_name<FuncType2>() << '\n';
}

答案 1 :(得分:2)

  

我宁愿专门使用成员变量func_name(如果可能的话)。

因此,如果我理解正确,那么您所看到的就是

class Test
 {
   private:
      template <typename> static const std::string func_name;

   public:
      template <typename T> 
      std::string GetFuncType () const
       { return func_name<T>; }
 };

template <typename> const std::string Test::func_name = "not func";
template<> const std::string Test::func_name<FuncType1> = "FuncType1";
template<> const std::string Test::func_name<FuncType2> = "FuncType2";
template<> const std::string Test::func_name<FuncType3> = "FuncType3";

假设FuncType1FuncType2FuncType3是不同的类型(在您的问题中不等于FuncType2FuncType3)。

以下是完整的编译示例

#include <string>
#include <iostream>

using FuncType1 = int (*)(double);
using FuncType2 = int (*)(int);
using FuncType3 = int (*)(long);

class Test
 {
   private:
      template <typename> static const std::string func_name;

   public:
      template <typename T> 
      std::string GetFuncType () const
       { return func_name<T>; }
 };

template <typename> const std::string Test::func_name = "not func";
template<> const std::string Test::func_name<FuncType1> = "FuncType1";
template<> const std::string Test::func_name<FuncType2> = "FuncType2";
template<> const std::string Test::func_name<FuncType3> = "FuncType3";

int main ()
 { 
   std::cout << Test{}.GetFuncType<int>() << std::endl;
   std::cout << Test{}.GetFuncType<FuncType1>() << std::endl;
   std::cout << Test{}.GetFuncType<FuncType2>() << std::endl;
   std::cout << Test{}.GetFuncType<FuncType3>() << std::endl;
 }

如果您希望Test{}.GetFuncType<int>()出现编译错误,则只能为请求的专业化初始化func_name

// template <typename> const std::string Test::func_name = "not func";
template<> const std::string Test::func_name<FuncType1> = "FuncType1";
template<> const std::string Test::func_name<FuncType2> = "FuncType2";
template<> const std::string Test::func_name<FuncType3> = "FuncType3";

// ...

std::cout << Test{}.GetFuncType<int>() << std::endl; // compilation error!