C++: Используя оператор двух внутренних типов как функциональный объект

Я скопировал ваш код, скачал пример файла json на свой рабочий стол и переименовал его в example_ 1.json (я включил пробел в имя файла).

import Foundation

// Set the file path
let path = "/Users⁩/username/Desktop/example_ 1.json⁩"

do {
    // Get the contents
    let contents = try String(contentsOfFile: path, encoding: .utf8)
    print(contents)
}
catch let error as NSError {
    print("Ooops! Something went wrong: \(error)")
}

Он успешно распечатал файл. Это также сработало, когда я определил содержимое как NSString.

let contents = try NSString(contentsOfFile: path, 
                            encoding: String.Encoding.ascii.rawValue)

Я использую Swift 4.2.1

5
задан Alex B 16 November 2008 в 03:59
поделиться

3 ответа

Во-первых, необходимо действительно возвратить ссылку из оператора + =, так как можно позже использовать их для реализации оператора +, оператора - и так далее. Я изменю это соответственно.

Кроме того, Ваш do_for_each должен быть шаблоном, так как он должен знать точный тип функционального объекта, поскольку объекты двоичной функции не являются классами полиморфа. Для фактической операции Вы хотите использовать std::transform:

template<class T, unsigned int D>
class Vector {

public:
    Vector& operator += (const T& value) { 
        do_for_each(std::plus<T>(), value); 
        return *this;
    }

    Vector& operator -= (const T& value) { 
        do_for_each(std::minus<T>(), value); 
        return *this;
    }

    Vector& operator *= (const T& value) { 
        do_for_each(std::multiplies<T>(), value);
        return *this; 
    }

    Vector& operator /= (const T& value) { 
        do_for_each(std::divides<T>(), value); 
        return *this;
    }

private:
    template<typename BinFun>
    void do_for_each(BinFun op, const T& value) {
        std::transform(data, data + D, data, std::bind2nd(op, value));
    }

    T data[D];
};

станд.:: преобразование просто передаст каждый элемент функциональному объекту и присваивает результат назад итератору, данному как третий аргумент.

8
ответ дан 13 December 2019 в 19:38
поделиться

Я думаю, что litb находится на корректной дорожке и ответил на точный вопрос.
Но я думаю, что это - неверное решение.

Я не использовал бы do_for_each (), а скорее использовал бы станд.:: преобразуйте () непосредственно:

template<class T, unsigned int D>
class Vector 
{

  public:
    Vector& operator += (const T& value) { 
        std::transform(data, data + D, data, std::bind2nd(std::plus<T>(),value)); 
        return *this;
    }

    Vector& operator -= (const T& value) { 
        std::transform(data, data + D, data, std::bind2nd(std::minus<T>(),value)); 
        return *this;
    }

    Vector& operator *= (const T& value) { 
        std::transform(data, data + D, data, std::bind2nd(std::multiplies<T>(),value));
        return *this; 
    }

    Vector& operator /= (const T& value) { 
        std::transform(data, data + D, data, std::bind2nd(std::divides<T>(),value)); 
        return *this;
    }

  private:
    T data[D];
};
1
ответ дан 13 December 2019 в 19:38
поделиться

Необходимо действительно взглянуть на Операторы Повышения, библиотека только для заголовка, которая действительно упрощает создающие ортогональные и последовательные перегрузки арифметического оператора.

Конкретно: Вы могли бы найти то получение из boost::operators::integer_arithmatic<T> сохраняет Вас большое повторение этого класса.

2
ответ дан 13 December 2019 в 19:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: