小编DCT*_*Lib的帖子

C++模板中条件代码实例化的最简洁方法

我正在尝试运行以下C++代码:

#include <cmath>

template<typename T, bool> class ConditionalData {
};

template <typename T> class ConditionalData<T, false> {
};

template <typename T> class ConditionalData<T, true> {
private:
    T data;
public:
    void setData(T _data) { data = _data; }
};


template<bool hasdata> class A {
public:
    A() {
        ConditionalData<double,hasdata> data;
        if (hasdata) {
            data.setData(sin(cos(123.4)));
        }
    }
};


int main(int argNum, const char**argData) {
    A<false> test1;
    A<true> test2;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

本质上,我想实现一个模板化的类A,其中根据模板参数执行某些操作.这些操作需要局部变量,我只想在需要时分配它们.我在这里遇到的问题是身体的问题

if (hasdata) {
    data.setData(3);
}
Run Code Online (Sandbox Code Playgroud)

条件也是为hasdata = false实例化的,它不能编译(使用g ++ 5.2).任何想法如何以最干净的方式完成这项工作而不将A :: …

c++ templates

18
推荐指数
3
解决办法
2726
查看次数

C++模板:按类分类,如何分解代码?

假设我有这个课程:

class Component1;
class Component2;
// many different Components
class Component42;

class MyClass
{
public:
    MyClass(void) {};
    std::list<Component1> component1List;
    std::list<Component2> component2List;
    // one list by component
    std::list<Component42> component42List;
};
Run Code Online (Sandbox Code Playgroud)

我想创建一个具有以下签名的函数:

template<class T> void addElement(T component);
Run Code Online (Sandbox Code Playgroud)

它应该做到以下几点:

  • 如果component是类型Component1,请将其添加到Component1List
  • if component是类型Component2,添加到Component2List,等等.

可能吗?这样做的好方法是什么?

我可以通过以下函数获得相同的行为:

template<class T> void addElement(int componentType, T component);
Run Code Online (Sandbox Code Playgroud)

但我宁愿不必指定componentType这样的:它是无用的信息,它打开了可能的错误的大门(如果componentType不代表组件的类型).

c++ oop templates design-patterns

14
推荐指数
2
解决办法
662
查看次数

跨模块的Python枚举

如果在主模块中定义了枚举,为什么不能跨模块边界正确检查Python 3枚举等式?这是一个例子:

moduleA.py:

#!/usr/bin/python3

import moduleB
from enum import Enum, unique

@unique
class MyEnum(Enum):
    A = 1
    B = 2
    # def __eq__(self,other):
    #     assert isinstance(other,self.__class__)
    #     return self.value == other.value

if __name__ == "__main__":

    myVar = MyEnum.B
    moduleB.doStuff(myVar)
Run Code Online (Sandbox Code Playgroud)

moduleB.py:

#!/usr/bin/python3

import moduleA

def doStuff(aVariable):
    bVariable = moduleA.MyEnum.B
    assert aVariable == bVariable
Run Code Online (Sandbox Code Playgroud)

在命令行上调用" ./moduleA.py "会产生:

Traceback (most recent call last):
  File "./moduleA.py", line 17, in <module>
    moduleB.doStuff(myVar)
  File "/home/ruedi/Dropbox/Reps/stuffed/sosy/testing/moduleB.py", line 7, in doStuff
    assert aVariable == bVariable
AssertionError
Run Code Online (Sandbox Code Playgroud)

取消注释枚举中的自定义相等运算符会导致断言失败.我发现在两种情况下类模块都不一样,因为在一种情况下它是"__main__".

解决这个问题的最"Pythonic方式"是什么(除了将枚举移动到自己的模块之外)? …

python enums module

11
推荐指数
1
解决办法
3446
查看次数

循环网络(RNN)不会学习一个非常简单的功能(问题中显示的图)

所以我试图训练一个简单的循环网络来检测输入信号中的"突发".下图显示了RNN的输入信号(蓝色)和所需(分类)输出,以红色显示.

然后应检测正弦形输入信号突发的结束.

因此,无论何时检测到突发,网络的输出都应从1切换到0,并与该输出保持一致.用于训练RNN的输入序列之间唯一变化的是突发发生的时间步长.

按照https://github.com/MorvanZhou/PyTorch-Tutorial/blob/master/tutorial-contents/403_RNN_regressor.py上的教程,我无法获得RNN学习.学习的RNN始终以"无记忆"方式运行,即不使用内存进行预测,如以下示例行为所示:

与之前相同的情节,但这次是网络的输出行为.

绿线显示网络的预测输出.在这个例子中我做错了什么,以至于无法正确学习网络?网络任务不是很简单吗?

我正在使用:

  1. torch.nn.CrossEntropyLoss作为损失函数
  2. 用于学习的Adam Optimizer
  3. 具有16个内部/隐藏节点和2个输出节点的RNN.他们使用torch.RNN类的默认激活功能.

实验已经用不同的随机种子重复了几次,但结果几乎没有差异.我使用了以下代码:

import torch
import numpy, math
import matplotlib.pyplot as plt

nofSequences = 5
maxLength = 130

# Generate training data
x_np = numpy.zeros((nofSequences,maxLength,1))
y_np = numpy.zeros((nofSequences,maxLength))
numpy.random.seed(1)
for i in range(0,nofSequences):
    startPos = numpy.random.random()*50
    for j in range(0,maxLength):
        if j>=startPos and j<startPos+10:
            x_np[i,j,0] = math.sin((j-startPos)*math.pi/10)
        else:
            x_np[i,j,0] = 0.0
        if j<startPos+10:
            y_np[i,j] = 1
        else:
            y_np[i,j] = 0


# Define the neural network
INPUT_SIZE = 1
class …
Run Code Online (Sandbox Code Playgroud)

python recurrent-neural-network pytorch

11
推荐指数
1
解决办法
506
查看次数

G++ 错误消息“?: 的操作数有不同的类型”,但我有两次相同的类型

为什么下面的代码不能编译?g++ 输出错误消息:

\n\n
test.cpp: In function \xe2\x80\x98void test(bool)\xe2\x80\x99:\ntest.cpp:11:15: error: operands to ?: have different types \xe2\x80\x98test(bool)::<lambda(int)>\xe2\x80\x99 and \xe2\x80\x98test(bool)::<lambda(int)>\xe2\x80\x99\n     yadda(flag?x:y);\n           ~~~~^~~~\n
Run Code Online (Sandbox Code Playgroud)\n\n

这对我来说没有什么意义,因为错误消息中给出的两种类型似乎是相同的。我正在使用以下代码:

\n\n
#include <functional>\n\nvoid yadda(std::function<int(int)> zeptok) {\n    zeptok(123);\n}\n\nvoid test(bool flag) {\n    int a = 33;\n    auto x = [&a](int size){ return size*3; };\n    auto y = [&a](int size){ return size*2; };\n    yadda(flag?x:y);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我使用“g++ -c test.cpp -std=c++14”进行编译,我的GCC版本是“6.3.0 20170406 (Ubuntu 6.3.0-12ubuntu2)”。

\n

c++ gcc c++14

1
推荐指数
1
解决办法
1719
查看次数