还没有读过有关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能否解析为正确的字符串?
答案 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";
假设FuncType1
,FuncType2
和FuncType3
是不同的类型(在您的问题中不等于FuncType2
和FuncType3
)。
以下是完整的编译示例
#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!