Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板参数推导/变量模板:如何使其工作?_C++_Templates_Template Argument Deduction - Fatal编程技术网

C++ 模板参数推导/变量模板:如何使其工作?

C++ 模板参数推导/变量模板:如何使其工作?,c++,templates,template-argument-deduction,C++,Templates,Template Argument Deduction,我在用非模板类包装模板类时遇到问题 我正在努力使此代码正常工作: my_class.hpp #ifndef MY_CLASS_HPP #define MY_CLASS_HPP #include <vector> #include <iostream> class VectorPrinter { private: template<class value_type> static std::vector<value_type> vec

我在用非模板类包装模板类时遇到问题

我正在努力使此代码正常工作:

my_class.hpp

#ifndef MY_CLASS_HPP
#define MY_CLASS_HPP

#include <vector>
#include <iostream>

class VectorPrinter {

private:

  template<class value_type>
  static std::vector<value_type> vec;

public:

  template<class value_type>
  VectorPrinter(const std::vector<value_type>& vec_)
  {
    vec = vec_
    for (std::size_t i = 0; i<vec.size(); ++i)
      std::cout << vec[i] << std::endl;
  }

};

#endif /* MY_CLASS_HPP */
现在:我的目标是避免将VectorPrinter定义为模板类,或者,避免在VectorPrinter不能是非模板的情况下指定模板参数;因此,我的问题存在于变量模板或模板参数推断的范围内

这只是对我的论文项目的一个测试;最后,我需要实现的是能够为RNG定义一个模板库,并将这些类封装在执行直接模拟蒙特卡罗的更复杂类中。所以,最后我想说:

template <class engineType>
class RngObject {
   // ...
};
模板
类RngObject{
// ...
};
类集合{
私人:
模板rng对象rng;
// ...
};
必须定义每一个将RNG封装为模板的类,这将是非常无聊的;此外,我被要求在这个阶段避免使用动态时间多态性

我希望有人能给我一些有用的建议。
谢谢

错误消息清楚地说明了您必须执行的操作:为
vec
指定模板参数

  template<class value_type>
  VectorPrinter(const std::vector<value_type>& vec_)
  {
    // Using a reference here so we don't have to type all this again and again.
    auto& v = vec<value_type>;
    v = vec_;
    for (std::size_t i = 0; i < v.size(); ++i)
      std::cout << v[i] << std::endl;
  }
模板
矢量打印机(常数标准::矢量和矢量)
{
//在这里使用引用,这样我们就不必一次又一次地键入所有这些内容。
自动&v=vec;
v=向量;
对于(std::size_t i=0;istd::cout错误消息非常清楚地说明了您必须执行的操作:为
vec
指定模板参数

  template<class value_type>
  VectorPrinter(const std::vector<value_type>& vec_)
  {
    // Using a reference here so we don't have to type all this again and again.
    auto& v = vec<value_type>;
    v = vec_;
    for (std::size_t i = 0; i < v.size(); ++i)
      std::cout << v[i] << std::endl;
  }
模板
矢量打印机(常数标准::矢量和矢量)
{
//在这里使用引用,这样我们就不必一次又一次地键入所有这些内容。
自动&v=vec;
v=向量;
对于(std::size_t i=0;istd::cout我怀疑您是否走对了路;您被迫以这种方式使用静态成员,但现在所有实例都将竞争这个单一的公共成员(当然,只有那些使用相同模板类型的实例)。这可能会导致具有相同模板类型的对象之间出现竞争条件,尤其是在多线程环境中

真正的模板类允许有非静态成员,这可能更安全,因此更可取

如果您选择使用模板变量只是为了不必在创建对象时重复模板参数,那么有一个好消息:自C++17以来,您可以让类模板参数来自构造函数。因此,如果您将类设置为模板:

template<class value_type>
std::vector<value_type> VectorPrinter::vec;
template<class value_type>
class VectorPrinter { /* ... */ };
但不要依赖静态成员


但是,如果您想将多个不同类型的
VectorPrinter
s(模板版本)放在一个公共容器中,则需要引入一个公共基类。因此,在这种情况下,您可以选择:无静态变量(尤其是:无可变数量的),但是多态性,或者相反。我有自己明确的个人偏好(并不意味着我会拒绝其他方法,如果在特定场景中证明其优越性),但您必须权衡自己…

我怀疑您是否走上了正确的道路;您被迫以这种方式使用静态成员,但现在所有实例都将竞争这个单一的通用成员(当然,只有那些使用相同模板类型的实例)。这可能会导致具有相同模板类型的对象之间出现竞争条件,尤其是在多线程环境中

真正的模板类允许有非静态成员,这可能更安全,因此更可取

如果您选择使用模板变量只是为了不必在创建对象时重复模板参数,那么有一个好消息:自C++17以来,您可以让类模板参数来自构造函数。因此,如果您将类设置为模板:

template<class value_type>
std::vector<value_type> VectorPrinter::vec;
template<class value_type>
class VectorPrinter { /* ... */ };
但不要依赖静态成员


但是,如果您想将多个不同类型的
VectorPrinter
s(模板版本)放在一个公共容器中,则需要引入一个公共基类。因此,在这种情况下,您可以选择:无静态变量(尤其是:无可变数量的),但是多态性,或者相反。我有自己明确的个人偏好(并不意味着我会拒绝其他方法,如果在特定场景中证明其优越性),但你必须衡量一下自己…

不明白-你能解释一下这是如何编译的吗?
模板静态std::vector vec;
-有一个静态成员vec,但每次构造函数调用类型都会改变???嗯,为每个实例化的构造函数创建一个静态成员?@Aconcagua正确。看。@Aconcagua老实说,我从未见过r以前也见过它。但是cppreference页面详细说明了这里必须发生的事情(而且clange错误消息也很清楚)。假设它是如此罕见,因为它迫使您(大量)使用它静态变量。如果需要静态变量,避免多态性可能是有用的,或者需要避免PM作为性能参数。否则,我认为真正的模板类是优越的。(但是,仍然是1的好答案。)不明白-你能解释一下这是如何编译的吗?
模板静态std::vector vec;
-有一个静态成员vec,但每次构造函数调用类型都会改变???嗯,为每个实例化构造函数创建一个静态成员?@Aconcagua正确。请看。@Aconcagua老实说,我以前从未见过使用它。但是cppreference页面详细说明了这里必须发生的事情(而且叮当声错误信息也很清楚)。假设它是如此罕见,因为它迫使您(大量)进入静态变量。这可能是有用的,以避免多态性,如果你需要静态变量无论如何,或者需要避免PM的性能回报。否则,我认为真正的模板类优越。(但仍然是1的好答案。)为什么你做一个深拷贝的向量打印?@ MooingDuck这只是一个测试;
VectorPrinter vp1(v1); // fine with above template, too - since C++17