Git Product home page Git Product logo

Comments (5)

yuqian90 avatar yuqian90 commented on May 1, 2024

Well, I played with factory and ASSISTED a bit more and I'm now more certain there's a bug somewhere.
E.g. I just slightly modified this example from the fruit test source code: tests/register_factory.cpp:

The following would not compile. I guess it's related to my issue.

#include <fruit/fruit.h>
#include <iostream>

using fruit::Component;
using fruit::Injector;
using fruit::Assisted;
using fruit::createComponent;

struct X {
  INJECT(X()) = default;
};

class Scaler {
private:
  double factor;
  int factor2;

public:
  INJECT(Scaler(ASSISTED(double) factor, ASSISTED(int) factor2, X))
    : factor(factor), factor2(factor2) {
  }

  double scale(double x) {
    return x * factor * factor2;
  }
};

using ScalerFactory = std::function<std::unique_ptr<Scaler>(double, int)>;

Component<ScalerFactory> getScalerComponent() {
  return createComponent();
}

int main() {
  Injector<ScalerFactory> injector(getScalerComponent());
  ScalerFactory scalerFactory(injector);
  std::unique_ptr<Scaler> scaler = scalerFactory(12.1, 3);
  std::cout << scaler->scale(3) << std::endl;

  return 0;
}

Compilation error:

In file included from /usr/include/fruit/fruit.h:25:0,
                 from ../di/RegisterFactoryTest.cpp:1:
/usr/include/fruit/impl/injection_errors.h: In instantiation of ‘struct fruit::impl::FunctorSignatureDoesNotMatchError<Scaler(double, int), Scaler(int, double)>’:
/usr/include/fruit/impl/component.defn.h:58:3:   required from ‘fruit::Component<Types>::Component(fruit::PartialComponent<Bindings ...>) [with Bindings = {}; Params = {std::function<std::unique_ptr<Scaler, std::default_delete<Scaler> >(double, int)>}]’
../di/RegisterFactoryTest.cpp:31:26:   required from here
/usr/include/fruit/impl/injection_errors.h:214:3: error: static assertion failed: Unexpected functor signature (it should be the same as ExpectedSignature minus any Assisted types).
   static_assert(
   ^
In file included from /usr/include/fruit/component.h:498:0,
                 from /usr/include/fruit/fruit.h:28,
                 from ../di/RegisterFactoryTest.cpp:1:
/usr/include/fruit/impl/component.defn.h: In instantiation of ‘fruit::Component<Types>::Component(fruit::PartialComponent<Bindings ...>) [with Bindings = {}; Params = {std::function<std::unique_ptr<Scaler, std::default_delete<Scaler> >(double, int)>}]’:
../di/RegisterFactoryTest.cpp:31:26:   required from here
/usr/include/fruit/impl/component.defn.h:61:3: error: no type named ‘Result’ in ‘fruit::impl::meta::OpForComponent<>::ConvertTo<fruit::impl::meta::Comp<fruit::impl::meta::Vector<>, fruit::impl::meta::Vector<fruit::impl::meta::Type<std::function<std::unique_ptr<Scaler, std::default_delete<Scaler> >(double, int)> > >, fruit::impl::meta::Vector<fruit::impl::meta::Pair<fruit::impl::meta::Type<std::function<std::unique_ptr<Scaler, std::default_delete<Scaler> >(double, int)> >, fruit::impl::meta::Vector<> > >, fruit::impl::meta::Vector<>, fruit::impl::meta::EmptyList> > {aka struct fruit::impl::meta::Error<fruit::impl::FunctorSignatureDoesNotMatchErrorTag, Scaler(double, int), Scaler(int, double)>}’
   (void)typename fruit::impl::meta::CheckIfError<fruit::impl::meta::Eval<fruit::impl::meta::CheckNoLoopInDeps(typename Op::Result)>>::type();
   ^
In file included from /usr/include/fruit/component.h:498:0,
                 from /usr/include/fruit/fruit.h:28,
                 from ../di/RegisterFactoryTest.cpp:1:
/usr/include/fruit/impl/component.defn.h:64:15: error: no match for call to ‘(Op {aka fruit::impl::meta::Error<fruit::impl::FunctorSignatureDoesNotMatchErrorTag, Scaler(double, int), Scaler(int, double)>}) (fruit::impl::ComponentStorage&)’
   Op()(storage);
               ^

from fruit.

poletti-marco avatar poletti-marco commented on May 1, 2024

Thanks for the report, it was indeed a bug.
I'm releasing version 2.0.1 soon with this fix.

from fruit.

poletti-marco avatar poletti-marco commented on May 1, 2024

FYI, I now released 2.0.1 with this fix and the binary packages have been updated. Please update to get the fix.

from fruit.

yuqian90 avatar yuqian90 commented on May 1, 2024

I gave 2.0.1 a try. It indeed fixed the problem. Thanks a lot!

from fruit.

poletti-marco avatar poletti-marco commented on May 1, 2024

Now 2.0.2 has been released with the fix to the other related bug.

from fruit.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.