- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个模板函数,我想在 std::vector
内部存储一个指针.
该函数如下所示:
template<typename T> void funcName(T& aT, std::vector<std::string>& fileName){...}
std::vector
中存储指向此类函数的多个指针.对于非模板函数,我会这样做:
typedef std::vector<std::string> string_vt;
typedef void func_t(T&, string_vt&);
typedef func_t* funcPointer;
typedef std::vector<funcPointer> funcPointer_vt;
for(int i = 0; i < initT.size(); ++i){
init_T[i]<T>(someT, fileName);
}
template<typename T_Relation, typename T_Relation_Vec, bool row>
void bulk_load(initRelation_vt& aInitFunctions, T_Relation_Vec& aRel_Vec, const bool aMeasure, const uint aRuns, const char* aPath)
{
for(size_t i = 0; i < aRuns; ++i)
{
MemoryManager::freeAll();
aRel_Vec.clear();
string_vt fileNames;
for(size_t j = 0; j < aInitFunctions.size(); ++j)
{
aRel_Vec.emplace_back(T_Relation());
aInitFunctions[j]<T_Relation>(aRel_Vec[j], fileNames);
BulkLoader bl(fileNames[j].c_str(), tuples, aRel_Vec[j], delimiter, seperator);
Measure lMeasure;
if(aMeasure)
{
lMeasure.start();
}
try
{
bl.bulk_load();
if(row)
{
BulkInsertSP bi;
bi.bulk_insert(bl, aRel_Vec[j]);
}
else
{
BulkInsertPAX bi;
bi.bulk_insert(bl, aRel_Vec[j]);
}
}
catch(std::exception& ex)
{
std::cerr << "ERROR: " << ex.what() << std::endl;
}
lMeasure.stop();
if(aMeasure)
{
std::ofstream file;
file.open (aPath, std::ios::out | std::ios::app);
//print_result(file, flag, lMeasure.mTotalTime());
file.close();
}
}
}
}
aInitFunctions[j]<T_Relation>(aRel_Vec[j], fileNames);
最佳答案
模板是 static polymorphism 的高级技术.在像 C++ 这样的类型化语言中,如果没有静态多态性,您必须单独定义使用的每个实体并精确指示引用的每个实体。
C++ 中的静态多态机制允许自动指示函数或方法并将其推迟到通过 构建重载 .它允许您通过 一次定义多个共享某些特征的实体。模板并将特定特化的定义推迟到构建,从使用中推断出来。
(注意,在各种场景下,静态多态允许单独的代码,这样使用和定义的变化是独立的,这非常有用。)
这种机制的重要含义是模板的每个特化可能是不同的类型。目前尚不清楚,在我做出回应时,您是要在一种类型的容器中存储指向单一类型还是多种类型的特化的指针。可能性还取决于函数模板的参数和结果类型。
C++ 中的函数的类型是其参数类型列表及其返回类型的组合。换句话说,接受和返回相同类型的两个函数是相同的类型。如果您的函数模板既没有采用或返回模板参数类型(即 T
)也没有模板化类型(例如 std::vector<T>
),则此函数模板的每个特化都将采用和返回相同的类型,因此将是相同的类型。
template <typename T>
int func() { ... }
int
, 随便
T
用于专门化模板。因此,在参数定义为
int (*f)()
的任何地方都可以使用指向它的指针。 .在这种情况下,您可以将指针指向一个 vector 中的任何特化。
typedef std::vector<std::string> string_vt;
typedef int func_t();
typedef func_t* funcPointer;
typedef std::vector<funcPointer> funcPointer_vt;
funcPointer x = &func<int>;
funcPointer y = &func<float>;
typedef
这个指针一次。
template <typename T>
void func(std::vector<T> param) { ... }
T
用来专攻。
typedef int func_t_int(std::vector<int>);
typedef func_t_int* funcPointerInt;
typedef std::vector<funcPointerInt> funcPointerInt_vt;
typedef float func_t_float(std::vector<float>);
typedef func_t_float* funcPointerFloat;
typedef std::vector<funcPointerFloat> funcPointerFloat_vt;
funcPointerInt x = &func<int>;
funcPointerFloat x = &func<float>;
template <typename T>
using funcPointer = void (*)(std::vector<T>);
funcPointer<int>
用作类型限定符,代替之前的
funcPointerInt
.
funcPointer<float> y = &func<float>;
std::vector
中存储指向各种特化的指针。 .在这种情况下
动态多态会有所帮助。要存储不同类型的值,fe。在一种类型的变量中指向不同类型函数的指针需要
继承 .可以在定义为父类(super class)的字段中存储任何子类。
备注 但是,这不太可能真正完成任何事情,也可能不是您真正想要的。
template <typename T>
class MyClass : BaseClass
{
public:
T operator()(const T& param, int value);
}
MyClass<int> a;
MyClass<float> b;
BaseClass* ptr = &a;
ptr = &b;
BaseClass
,所以是指向
BaseClass
的指针实际上可以指向它们中的任何一个,还有一个
std::vector<funcPointerBase>
可以用来存储它们。通过重载
operator()
我们创建了一个模仿函数的对象。这种类的有趣特性是它可以使用参数构造函数创建多个实例。如此有效的类模板产生多种类型的特化,反过来每个特化类都可以产生不同参数化的实例。
template <typename T>
class MyClass : BaseClass
{
int functor_param;
public:
MyClass(int functor_param);
T operator()(const T& param, int value);
}
MyClass<int> a(1);
MyClass<int> b(2);
MyClass<float> c(4);
MyClass<int>* ptr = &a;
ptr = &b;
ptr = &c;
template <typename T>
T func(std::pair < T, char>) {}
template <typename T>
using funcPointer = T(*)(std::pair<T, char>);
template <typename T>
class MyPointer : BasePointer
{
funcPointer<T> ptr;
public:
MyPointer(funcPointer<T> ptr);
T()(std::pair <T, char>) operator*(std::pair <T, char> pair)
{
*ptr(pair);
}
};
std::vector<BasePointer>
存储所有可能的伪函数指针。
std::vector<>
中。 ,它们被视为基本类型。特定的函数调用需要特定类型的参数并返回特定类型。如果所有子类都可以以相同的方式执行任何操作,则可以通过在基类中定义这样的方法来公开它(在使用仿函数或指针的任何一种情况下……或?),但特定的专用函数调用不是那种的东西。经过所有这些努力,您最终想要执行的每个函数调用都将是不同的类型,需要不同类型的参数和/或返回不同类型的值。因此,它们永远不可能在通常情况下都适契约(Contract)一个地方,而不是模板化代码,执行中的相同环境。如果他们这样做了,那么首先就不需要动态多态来解决这个问题。
关于c++ - 我可以有一个 std::vector 的模板函数指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41749792/
我有这个析构函数,它在运行时产生错误“vector 迭代器不可取消引用”。 gridMatrix 是一个 std::vector * > * > * > * > 我添加了 typename 和 typ
我有一个 vector 的 vector ,比方说 std::vector > my2dArray; 现在我想要一个 vector ,其中包含 my2dArray 中 vector 的大小。手动这看起
假设我有一些 vector :v1、v2、v3 假设我还有一个 vector 来保存这些 vList = {v1, v2, v3} 如果我同步了 (vList),这是否意味着 v1、v2 和 v3 也
我正在创建一个 char 的二维 vector 数组作为类变量,但我在将 vector 添加到 vector 数组中时遇到了麻烦。 我正在使用 C++ 11 标准运行 gcc。 我尝试使用 vecto
如何修改 Vec基于 Vec 中某项的信息没有对向量的不可变和可变引用? 我已尝试创建一个最小示例来演示我的特定问题。在我的真实代码中,Builder struct 已经是其他答案提出的中间结构。具体
这个问题在这里已经有了答案: What is the idiomatic Rust way to copy/clone a vector in a parameterized function? (
在我的程序中,我有一个整数 vector 的 vector 。现在我想从 vector 的 vector 中取出一个 vector 并在另一个 vector 容器中对其进行操作,但是我得到了错误...
我得到一个vector>数据由 OpenCV 提供。由于某些原因(例如偏移/缩放),我需要转换数据 Point至Point2f 。我怎样才能做到这一点? 例如: std::vector > conto
我有一个函数,该函数应使用来自字符串类型的给定 vector vector 中的某些元素初始化来自字符串类型的空 vector vector 。我的语法看起来像这样 std::vector> extr
我得到一个vector>数据由 OpenCV 提供。由于某些原因(例如偏移/缩放),我需要转换数据 Point至Point2f 。我怎样才能做到这一点? 例如: std::vector > conto
这里有很多类似的问题,但我没有真正找到任何可以特别回答我的问题的问题。 我有一个 vector 的 vector 作为类的属性。另一个属性是 bucket_count。我想将 vector 的 vec
如果我像这样创建一个 vector 的 vector : std::vector> myVectorOfVectors; 然后用一些东西填充它: std::vector myVector1; myVe
我正在用 C++ 编写自定义 vector 类。我对这样的代码有疑问: vector vec; vec.push_back(one); vec.push_back(two);
这是我发布的问题 c++ program for reading an unknown size csv file (filled only with floats) with constant (b
vector> a; for (int i=0;i v(i+1); iota(v.begin(),v.end(),1); a.push_back(v); } a.erase(a.beg
也许已经晚了,但我不明白为什么我会得到一个超出此代码范围的 vector 下标: int m = 3; int n = 2; std::vector> path(m, std::vector(n, 0
这个问题真的很奇怪,我似乎找不到任何导致它的原因。 所以这里有一个赋值运算符重载函数,鸟类和哺乳动物都是 vector 。 (下面是类) const Register& Register::opera
我怎么去 std::vector> 只是 std::vector> ?有真正有效的方法吗? 最佳答案 我会做这样的事情: #include #include int main() { //
我正在尝试将这些 vector 中的一些数据写入文本文件。当我运行代码时,它返回运行时错误。 Category、Product、Cart、Customer和Address都是struct 包含每个 g
显然它会因您使用的编译器而异,但我很好奇执行 vector> 时的性能问题与 vector*> ,尤其是在 C++ 中。具体来说: 假设您的外部 vector 已满,您想要开始将元素插入到第一个内部
我是一名优秀的程序员,十分优秀!