2016-06-30 21 views
-6

この質問は楽しいためですが、私が知っています。強制operator_(アンダースコア)

しかし、私はが本当には、以下のように有効(有効が緩く定義されていると!)のようなものを持つに「曲げ」このルールをしたいと思います。

T result = somevar _ someother; 

私は可能な解決策はありませんでしたが、おそらくいくつかのプリプロセッサübertricksを使用することができます。 (もちろん、単に#define _ SOMETHINGはかなり危険である)

すべてのヘルプは大歓迎です!

+0

、あなたが行うには、この "演算子を" 何をご希望ですか? –

+1

あなたはすでに答えを出して、 '#define _ OPERATOR_OF_YOUR_CHOICE'を使うだけですが、それについての楽しみは何ですか? Imhoもマクロも難読化されていないコードも面白いです – user463035818

+0

@RichardHodges何か、別の 'T'を別のコンテンツで返します。たとえば 'class T {public:int content; }; '。 – senseiwa

答えて

1

方法:関心のうち

#include <iostream> 

struct Underscore {}; 
#define _ | Underscore() | 

template<typename T> 
struct Has 
{ 
    const T& m_t; 

    Has(const T& t) 
    : m_t(t) 
    { 
    } 
}; 

template<typename T> 
Has<T> operator|(const T& lhs, const Underscore&) 
{ 
    return Has<T>(lhs); 
} 

template<typename T, typename U> 
auto operator|(const Has<T>& lhs, const U& rhs) 
{ 
    std::cout << "This is the body of your iterator for " << lhs.m_t << " and " << rhs << std::endl; 
    return 0; 
} 

int main() 
{ 
    const std::string a = "a"; 
    const std::string b = "b"; 
    a _ b; 

} 
1

楽しみのために、このような何か?これについて

#include <iostream> 


struct _magic_ 
{ 
}; 

template<class T> 
    struct enchanted 
    { 
    enchanted(T t) : value(t) {} 
    T value; 
    }; 

static constexpr auto _ = _magic_{}; 

template<class T> 
enchanted<T> operator| (T&& t, _magic_ magic) 
{ 
    return {std::forward<T>(t)}; 
} 

template<class T, class U> 
auto operator| (const enchanted<T>& e, U u) 
{ 
    return e.value + u; 
} 

int main() 
{ 
    int x = 4; 
    int y = 5; 
    auto z = x |_| y; 

    std::cout << z << std::endl; 
} 
+0

カスタムタイプのマジックトリックの定義はどうですか? – senseiwa

+1

@senseiwaは 'template の特殊化を提供するだけです。 auto operator | (const enchanted &e、U u) ' –