小编Rob*_*lck的帖子

为什么在这种情况下需要模板消除歧义?

我试图理解为什么我需要在一些openCL代码中使用模板消歧器.

编辑:这是一个最小的复制案例:

//test.hpp
#include <iostream>
#include <vector>
#include "cl.hpp"

template <typename T>
class Foo {
    public:
    std::vector<cl::Platform> platforms;
    std::vector<cl::Device> devices;    
    Foo();   
    void bar();
};

template<typename T>
Foo<T>::Foo() {      
    cl::Platform::get(&platforms);
    platforms[0].getDevices(CL_DEVICE_TYPE_GPU, &devices);
}

template<typename T>
void Foo<T>::bar() {
    // Fails to compile:  error: expected expression
    //std::cout << devices[0].getInfo<CL_DEVICE_NAME>() << std::endl;
    // Works
    std::cout << devices[0].template getInfo<CL_DEVICE_NAME>() << std::endl;
    // Also works
    cl::Device &mydevice = devices[0];
    std::cout << mydevice.getInfo<CL_DEVICE_NAME>() << std::endl;

}
Run Code Online (Sandbox Code Playgroud)

和源文件:

//test.cpp
#include "test.hpp"

int main() {
    Foo<double> foo = …
Run Code Online (Sandbox Code Playgroud)

c++ templates opencl

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

将对象从一个派生类更改为另一个派生类

我有几个共享一个公共基类的类,除了它们的方法工作方式不同.因此,在下面的示例中,除了执行计算的方式外,Adder和Multiplier是相同的.

有没有办法在飞行中将"a"改为乘数?我是否需要实现将派生类相互转换的方法?例如

a = a.asMultiplier()

正如您在下面的代码中看到的那样,我尝试将reinterpret_cast转换为乘法器,没有运气,它仍然像加法器一样.(gcc OS X v4.2.1)

#include <iostream>


class Base {
protected:
    int a,b;    
public:
    Base(int a, int b) {
        this->a = a;
        this->b = b;
    }  
    virtual ~Base() { }    
    virtual int calculate() = 0;
};


class Adder : public Base {    
public:
    Adder(int a, int b) : Base(a, b) {

    }      
    int calculate() {
        return this->a + this->b;
    }
};


class Multiplier : public Base {    
public:
    Multiplier(int a, int b) : Base(a, b) …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism

3
推荐指数
2
解决办法
4585
查看次数

用C/C++将数组转换为矩阵?

如果我有一个内部使用3x3矩阵的函数,但由于API的限制必须传递一个由9个元素组成的连续数组,有没有办法将数组基本上转换为2d数组?

以下方法不起作用,但希望它传达了我正在尝试做的事情.

我知道像Eigen这样的软件包让这件事变得微不足道,但不幸的是,在这种情况下,它不适合我.

void transpose_3x3( double x[3][3] ) {
    ...
}

void foo( double x[9], double y[3][3] ) {

    transpose_3x3(y)  // OK    

    double *my_x[3][3] = &x[0];

    transpose_3x3(&my_x);  // How?

}
Run Code Online (Sandbox Code Playgroud)

编辑

感谢Daniel向我展示了演员的正确目标,我能够使用C++ reinterpret_cast函数来实现这一目标.虽然union和memcpy解决方案有效,但是单个显式转换似乎是最直接的解决方案,恕我直言.

#include <iostream>

void print_matrix( double x[3][3] ) {

    for(unsigned int i=0; i< 3; i++) {
        for(unsigned int j=0; j<3; j++) {
            std::cout << x[i][j] << "  ";
        }
        std::cout << std::endl;
    }
}

int main() {

    double a[9] = { 1, 2, 3, 4, 5, 6, 7, …
Run Code Online (Sandbox Code Playgroud)

c c++ arrays multidimensional-array

3
推荐指数
2
解决办法
4848
查看次数

numpy:沿第一个轴乘以任意形状数组

我想将数组沿其第一个轴乘以某个向量。

例如,如果a是2D,b是1D,并且a.shape[0] == b.shape[0],我们可以这样做:

a *= b[:, np.newaxis]
Run Code Online (Sandbox Code Playgroud)

如果 a 具有任意形状怎么办?在 numpy 中,省略号“...”可以解释为“用‘:’填充剩余的索引”。是否有等效的方法用 None/np.newaxis 填充剩余的轴?

下面的代码生成所需的结果,但我更喜欢使用通用的向量化方法来完成此操作,而无需退回到 for 循环。

from __future__ import print_function

import numpy as np


def foo(a, b):
    """
    Multiply a along its first axis by b
    """
    if len(a.shape) == 1:
        a *= b
    elif len(a.shape) == 2:
        a *= b[:, np.newaxis]
    elif len(a.shape) == 3:
        a *= b[:, np.newaxis, np.newaxis]
    else:
        n = a.shape[0]
        for i in range(n):
           a[i, ...] *= b[i]          

n = 10
b = …
Run Code Online (Sandbox Code Playgroud)

python numpy

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