使用在模板化 C++ 类中定义的类型声明
use of type declaration defined in a templated c++ class
在下面的示例中声明coord
变量的正确方法是什么?模板参数占位符将起作用,例如:
MyClass<int>::Coord coord;
考虑到Coord
完全与模板参数无关,这肯定是丑陋的。理想情况下,是否有一些语法允许我在不指定任何模板参数的情况下声明coord
?
template <typename T>
class MyClass {
public:
enum Coord {
x, y, z,
};
};
int main(int argc, char *argv[]) {
MyClass<???>::Coord coord;
}
如果您希望能够使用没有模板类型的Coord
MyClass
,请将其(以及所有非模板内容)从MyClass
移动到非模板基类。您将将其用作:
MyBase::Coord coord;
你会得到以下内容等于true
:
std::is_same<MyClass<void>::Coord, MyClass<int>::Coord>::value
我不知道您希望将其false
enum
的情况,除非您想将其专业化。
考虑:
template <>
class MyClass<std::string> {
public:
static int Coord = 42;
};
我希望通过这个例子向您展示的是,指定模板参数实际上可以产生巨大的差异,即使Coord
本身不依赖于它。因此,如果Coord
真的不应该依赖于模板参数(这里似乎是这种情况),那么它首先不应该是模板类的成员。
基本上,除了其他人所说的之外,你应该考虑它是否应该是一个类成员,如果它应该是,你应该考虑把它移动到基类。
话虽如此,您可以创建以下代码,虽然有些复杂,但允许您使用
MyClass<>::Coord coord;
首先在 detail
命名空间中定义一个虚拟类:
namespace detail
{
struct MyClassVoid{};
};
现在声明你的类
template <typename T>
class MyClass;
并赋予它虚拟类一个专门的功能,在其中定义"非模板"的东西:
template<>
class MyClass<detail::MyClassVoid>
{
public:
enum Coord {
x, y, z,
};
};
现在定义类的一般形式,从专用形式派生:
template <typename T=detail::MyClassVoid>
class MyClass : public MyClass<detail::MyClassVoid> {
// "Real members" go here.
};
这将构建:
int main(int argc, char *argv[]) {
MyClass<>::Coord coord;
}
完整代码:
namespace detail
{
struct MyClassVoid{};
};
template <typename T>
class MyClass;
template<>
class MyClass<detail::MyClassVoid>
{
public:
enum Coord {
x, y, z,
};
};
template <typename T=detail::MyClassVoid>
class MyClass : public MyClass<detail::MyClassVoid> {
};
int main(int argc, char *argv[]) {
MyClass<>::Coord coord;
}
相关文章:
- 使用QJsEngine在Qt中注册自定义类型
- 在UE4中使用未定义类型'UTextBlock'
- 修改"std::set"中用户定义类型的值
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 如何使自定义类型在unordered_map中用作键
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- Qt5 远程对象 + 自定义类型,但不在 POD 中
- 为什么转换函数声明不需要至少一个定义类型说明符
- 标准::原子中的自定义类型
- 如何使用自定义类型声明Arduino数组?
- 如何在 Cython 中定义返回 cpp 定义类型的函数?
- 使用自定义访问者时具有自定义类型的提升变体失败(源自 boost::static_visitor)
- 您可以将binary_search应用于具有自定义类型的矢量吗?
- 在自定义类型图中重用 SWIG 映射
- 扩展自定义类型的spdlog
- vim使用户定义类型的COLOR与C++中的基本类型相同
- 重载自定义类型的 std::to_string 和 std::to_chars?
- 具有未声明/未定义类型的 typedef 结构
- 函数重载:内置类型与用户定义类型