将enableif与模板专业化结合使用
using enable_if with template specialization
我想使函数get_type_name。对于属于特定集合的类型,例如数字、几何体等,我想制作一个get_type_name函数,该函数使用类型trait的enable_if。对于不属于特定集合的每个类型,我想专门化它自己的get_type_name函数。这是我的代码,我得到了以下编译器错误,无法找出原因:
错误C2668:"get_type_name":对重载函数的调用不明确可能是"std::string get_type_name(myenable_if::type*)'或'std::string get_type_name(void*)'
template<bool B, typename T = void>
struct myenable_if {};
template<typename T>
struct myenable_if<true, T> { typedef void type; };
template<class T>
struct is_number
{
static const bool value = false;
};
template<>
struct is_number<int>
{
static const bool value = true;
};
template<class T>
std::string get_type_name(void* v=0);
//get_type_name for specific type
template<>
std::string get_type_name<std::string>(void*)
{
return std::string("string");
}
//get_type_name for set of types
template<class T>
std::string get_type_name(typename myenable_if<is_number<T>::value>::type* t=0)
{
return std::string("number");
}
int main()
{
std::string n = get_type_name<int>();
}
这是一个工作版本。
#include <iostream>
#include <string>
#include <vector>
#include <iostream>
template<bool B, typename T = void>
struct myenable_if {};
template<typename T>
struct myenable_if<true, T> { typedef T type; };
template<class T>
struct is_number
{
static const bool value = false;
};
template<>
struct is_number<int>
{
static const bool value = true;
};
template<class T>
std::string get_type_name_helper(void* t, char)
{
return "normal";
}
template<class T>
typename myenable_if<is_number<T>::value, std::string>::type get_type_name_helper(void* t, int)
{
return "number";
}
//get_type_name for specific type
template<>
std::string get_type_name_helper<std::string>(void* t, char)
{
return std::string("string");
}
template <class T>
std::string get_type_name(void* t = 0)
{
return get_type_name_helper<T>(t, 0);
}
int main() {
std::string n = get_type_name<int>();
std::cout << n << 'n';
n = get_type_name<std::string>();
std::cout << n << 'n';
n = get_type_name<float>();
std::cout << n << 'n';
return 0;
}
请参阅实时演示
相关文章:
- 多态性和功能结合
- 如何使用默认参数等选择模板专业化
- 模板化建造师专业化
- 类模板的成员功能的定义在单独的TU中完全专业化
- 部分专业化和嵌套模板
- 模板专业化可以进入我的.cpp吗?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 将 Vulkan 与 SFML 结合使用?
- 部分专业化和对标准::void_t<>的需求
- 将 c++ 生成器应用程序与外部 dll 结合使用
- "专业化不参与超载"
- 特定好友功能专业化
- 如何将增强MSM与增强信号结合使用?
- 是否可以混合使用SFINAE和模板专业化?
- MS Visual Studio 解决方案结合了非托管C++项目和 C# 项目
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 为什么在班级专业化上会出现错误?
- enable_if如何帮助选择类模板的专业化?
- 将预编译的 C 共享库与 JNI/NDK 结合使用
- 将enableif与模板专业化结合使用