enable_if на перегруженном операторе с другим типом возврата - PullRequest
2 голосов
/ 01 сентября 2010

Я пытаюсь в основном сделать 3 вещи одновременно: перегрузить оператор присваивания с помощью шаблона, ограничить типы (используя boost :: enable_if) и получить определенный тип возврата.

Взять это в качестве примера:

template <class T>
std::string operator =(T t) {  return "some string"; }

Теперь, согласно boost enable_if (sec 3, bullet pt 1), мне пришлось бы использовать enable_if в качестве возвращаемого типа, так как я перегружаю оператор, который может принимать только один аргумент. Однако я хотел бы, чтобы возвращаемый тип представлял собой строку, и поэтому он не обязательно должен совпадать с типом аргумента шаблона.

Я хотел бы использовать enable_if просто потому, что хочу, чтобы он просто пропускал шаблон, если он не является допустимым типом (не выдает ошибку).

У кого-нибудь есть идеи, как этого достичь?

1 Ответ

3 голосов
/ 02 сентября 2010
#include <iostream>
#include <boost/utility/enable_if.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/contains.hpp>

class FooBar
{
public:
    FooBar () {}
    ~FooBar () {}

    template <typename T>
    typename boost::enable_if <
        typename boost::mpl::contains <
            boost::mpl::vector<std::string, int>, T>::type,
            std::string>::type
    operator = (T v)
    {
        return "some string";
    }
};

int
main ()
{
    FooBar bar;
    bar = 1;
    bar = std::string ("foo");
    // bar = "bar"; // This will give a compilation error because we have enabled
                    // our operator only for std::string and int types.
}
...