[Feature Issue] undefined operator of custom data type should not be called
- Dominant language
- C++
- Stars
- 23
- Forks
- 41
- PR merge metrics
- No merged PRs in 30d
Description
```cpp
#include
#include
#include
namespace proto = boost::proto;
namespace space
{
template
class placeholder {};
template
class vector_space:
public proto::callable_context>
{
public:
using result_type = data_type;
private:
std::vector __data;
public:
template ... type_list>
vector_space(const type_list & ... value_list)
{
(__data.push_back(value_list), ...);
}
public:
auto & get_ref() const
{
return __data;
}
public:
template
result_type operator()(proto::tag::terminal, space::placeholder) const
{
return __data[I];
}
};
template
class eval_class
{
public:
template
data_type operator()(const expr_type & expr, const data_type & d1, const data_type & d2) const
{
auto ctx = space::vector_space{d1, d2};
return proto::eval(expr, ctx);
}
};
template
class anti_linear
{
private:
data_type __data;
public:
anti_linear(): __data{0} {}
anti_linear(const data_type & data__):
__data{data__}
{
}
public:
operator data_type & ()
{
return __data;
}
operator data_type () const
{
return __data;
}
public:
auto operator+(const anti_linear & al) const
{
std::cout << "[info] operator+ #1 is called\n";
return anti_linear{__data + al.__data};
}
auto operator+(const data_type & dt) const
{
std::cout << "[info] operator+ #2 is called\n";
return anti_linear{__data + dt};
}
public:
void print() const
{
std::cout << "__data: " << __data << std::endl;
}
};
} // namespace space
int main()
{
{
const auto x0 = proto::terminal>::type{};
const auto x1 = proto::terminal>::type{};
const auto eval = space::eval_class>{};
const auto a0 = space::anti_linear{2.1};
const auto a1 = space::anti_linear{-3.2};
std::cout << "------------------------------------------------\n";
{
eval(x0+x1, a0, a1).print(); // (1)
}
std::cout << "------------------------------------------------\n";
{
eval(x0+3.0, a0, a1).print(); // (2)
}
std::cout << "------------------------------------------------\n";
{
eval(x0*x1 + x0/2.0 + x1/3.0, a0, a1).print(); // (3)
}
std::cout << "------------------------------------------------\n";
}
}
```
Output:
```
------------------------------------------------
[info] operator+ #1 is called
__data: -1.1
------------------------------------------------
[info] operator+ #2 is called
__data: 5.1
------------------------------------------------
__data: -6.73667
------------------------------------------------
```
`operator/` and `operator*` are not defined for `space::anti_linear`, it should make a compiling error, but not.
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.