常量数据持有者类的c++模板
c++ template for constant data holder class
我正在尝试设计一个类,它的所有数据都是常量,并且在编译时都知道。我可以通过手动键入所有内容来创建它,但我想使用模板,这样我就不必多次重写几乎相同的代码。
我在想模板是实现这一点的方法,例如
template<class T> class A { ... }
A<float>
A<MyObject>
A<int>
但后来我不确定如何将我所知道的恒定数据输入到这个对象中。我可以在运行时使用一个成员函数来完成这项工作,该函数对类型或类似的东西执行switch语句,但理想情况下,我希望它能有效地成为我使用的愚蠢数据持有者。
所以在A<float>
的情况下,我会有这样的:
// member function
int getSize() {
return 4;
}
代替(伪代码)
// member function
int getSize() {
if (type == float) {
return 4;
} else if ...
}
我想知道是否有已知的方法可以做到这一点?我对constexpr没有任何经验,这可能是关键吗?
edit:澄清一下:我想要的成员函数总是基于模板化的类型/类返回相同的结果。例如,A总是从getSize()返回4,从getSomethingElse()返回1,从getAnotherThing()返回6.2。其中,as A将从getSize()返回8,从getSomethingElse()返回2,从getAnotherThing()返回8.4。
您可以拥有此模板
template <int size_, int foo_, int bar_>
struct MyConstData {
static const int size = size_; // etc
};
然后专门化你的模板:
template <class T> class A;
template <> class A<float> : MyConstData<13,42,-1> {};
template <> class A<double> : MyConstData<0,0,42> {};
您可以在一个类中专门化特定的函数,鉴于您对事物的描述,我怀疑这正是您想要的。这是一个如何工作的例子:
#include <iostream>
#include <string>
template <class T>
class A {
public:
int MyConstantFunction() const { // Default implementation
return 0;
}
};
template <>
int A<int>::MyConstantFunction() const
{
return 3;
}
template <>
int A<float>::MyConstantFunction() const
{
return 5; // If you examine the world, you'll find that 5's are everywhere.
}
template <>
int A<double>::MyConstantFunction() const
{
return -5;
}
int main(int, char *[])
{
using ::std::cout;
A<int> aint;
A<float> afloat;
A<long> along;
cout << "aint.MyConstantFunction() == " << aint.MyConstantFunction() << 'n';
cout << "afloat.MyConstantFunction() == "
<< afloat.MyConstantFunction() << 'n';
cout << "along.MyConstantFunction() == "
<< along.MyConstantFunction() << 'n';
return 0;
}
注意along
是如何使用类声明中的默认实现的。这凸显了这里的危险。如果对给定类型使用你的专业化的翻译单位没有看到这种专业化,它就不会使用它,这可能会导致各种有趣的问题。确保发生这种情况。
另一种选择是根本不提供默认实现,因此会出现实例化错误。
我的直觉是,你在做一些毫无意义的、糟糕的设计。但是,由于我不知道完整的背景,我不能肯定地说。如果你坚持这样做,下面是方法。
如果你想根据类型实现不同的东西,你可以试试这个:
template <class T>
class Foo {
T data;
string toString() {
return myGeneralToString(data);
}
};
template <>
class Foo<string> {
string data;
string toString() {
return "Already a string: " + data;
}
};
如果你只想要模板化的常量,我会试试这个:
template <int a, int b>
class Calc {
public:
static constexpr int SUM = a + b;
};
int main()
{
std::cout << Calc<3, 5>::SUM << std::endl;
return 0;
}
Edit:正如Omnifarious C++14所指出的,它在没有模板化类本身的情况下模板化了常量。因此,您可以将示例简化为:
class Calc {
public:
template <int a, int b>
static constexpr int SUM = a + b;
};
int main()
{
std::cout << Calc::SUM<3, 5> << std::endl;
return 0;
}
- .cpp和.h文件中的模板专用化声明
- C++模板来检查友元函数的存在
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何在c++中为模板函数实例创建快捷方式
- 使用C++中的模板和运算符重载执行矩阵运算
- 有人能分解一下这个c++模板的语法吗
- 如何在c++17中制作一个模板包装器/装饰器
- 模板化建造师专业化
- 调用专用模板时出错"no matching function for call to [...]"
- 模板元程序查找相似的连续类型名称
- 如何在C++20中创建模板别名的推导指南
- 没有名称的C++模板参数
- 具有重复类型的C++可变模板
- 如何将enable-if与模板参数和参数包一起使用
- 没有用于初始化C++中的变量模板的匹配构造函数