投稿数 - 437, コメント - 55186, トラックバック - 156

C++ - boost::function はどのように可変長引数に対応しているのか

「超汎用関数ポインタ」のコメントより

boost::functionは難しくてギブアップ・・・
可変長のオーバーロードをどうやって解決しているのか
が知りたかったんだけど、
(以下略)

C++ の真骨頂はプリプロセッサとテンプレートを駆使したメタプログラミングにある。メタプログラミングこそが、C++ を他言語の追随を許さない超言語に押し上げていると共に、比類なき難度を持った言語にしている。

boost::function も、そこそこにメタしている実装のひとつだ。

とりあえず、プリプロセスされていない状態では理解が難しいので、プリプロセスだけ実行する。そうすれば格段にソースコードは読み易くなる。Visual C++ なら「/E」「/PE」「/EP」コンパイラオプションを使うと、プリプロセスした結果が得られる。

以下は、boost::function をプリプロセスした結果の抜粋だ(実装は省略)。

template<typename R, typename Allocator = std::allocator<function_base> >
class function0 : public function_base{
}
template<typename R, typename T0, typename Allocator = std::allocator<function_base> >
class function1 : public function_base{
}
template<typename R, typename T0, typename T1, typename Allocator = std::allocator<function_base> >
class function2 : public function_base{
}

要するに、上記のようなテンプレートが N 個できる(デフォルトでは 10 個。つまり引数 10 まで対応できる)。テンプレートの部分特殊化や関数型テンプレートパラメータに対応していないコンパイラでは、これら function0、function1 といった引数の数に応じて名前の違うテンプレートを使用する。

古いコンパイラでないならば、boost::function が以下のように使えるのは前回の通り。

#include <boost/function.hpp>

using namespace boost;
bool func0(){
    return true;
}

bool func2(int i1, int i2){
    return true;
}

int main(){
    function<bool (void)> f0 = func0;
    function<bool (int, int)> f2 = func2;
    return 0;
}

さて、どのようになっているのか?

テンプレートの部分特殊化と関数型テンプレートパラメータ(※1)

先程のプリプロセスの結果には以下のようなコードもある(実装は省略)。

template<typename R, typename Allocator>
class function<R (void), Allocator> : public function0<R, Allocator>{
}
template<typename R, typename T0, typename Allocator>
class function<R (T0), Allocator> : public function1<R, T0, Allocator>{
}

template<typename R, typename T0, typename T1, typename Allocator>
class function<R (T0, T1), Allocator> : public function1<R, T0, T1, Allocator>{
}

上記のテンプレートが N個できる(デフォルト 10 個)。これがテンプレートの部分特殊化である。

テンプレート部分特殊化を使うとテンプレートは以下のように書ける。テンプレートの特殊化とは少々違う。

// 普通のテンプレート
template<typename T>
class clazz{
};
// T がポインタの場合だけ特別に使うテンプレート
template<typename T>
class clazz<T*>{
};

また、テンプレートパラメータを関数型として特殊化(部分特殊化ではない)できる。

typedef void (*f)(void);

// テンプレートパラメータを void (*f)(void) の関数型に特殊化。
template<>
class clazz<f>{
};

テンプレートの部分特殊化としてテンプレートパラメータを関数型にすると以下のようになる(多分このような解釈)。

// 戻り値型が R、引数型が T0 の関数型として部分特殊化
template<typename R, typename T0>
class clazz<R (T0)>{
};

従って、boost::function はプリプロセッサで複数の(デフォルトでは 10 個)テンプレート部分特殊化した定義により、可変長引数に対応している。

 

以下は、実装を非常に単純にして、テンプレート部分特殊化(関数型テンプレートパラメータ)を示したコード。

#include <iostream>
using namespace std;

template<typename R>
class function0{
public:
    void operator()() const{
        cout << "call arg0" << endl;
    }
};

template<typename R, typename T0>
class function1{
public:
    void operator()() const{
        cout << "call arg1" << endl;
    }
};

template<typename R, typename T0, typename T1>
class function2{
public:
    void operator()() const{
        cout << "call arg2" << endl;
    }
};
template<class T>
class function;

template<typename R>
class function<R (void)> : public function0<R>{};

template<typename R, typename T0>
class function<R (T0)> : public function1<R, T0>{};

template<typename R, typename T0, typename T1>
class function<R (T0, T1)> : public function2<R, T0, T1>{};

int main(){
    function<bool (void)> f0;
    function<bool (int)> f1;
    function<bool (int, int)> f2;
    f0(); // 出力 : "call arg0"
    f1(); // 出力 : "call arg1"
    f2(); // 出力 : "call arg2"
    return 0;
}

 

※1 「関数型テンプレートパラメータ」とは私が勝手に命名したもの。正式な名称は分からない。誰か教えて。

投稿日時 : 2008年1月7日 22:06

フィードバック

# re: C++ - boost::function はどのように可変長引数に対応しているのか

私の場合、functionNは作らずにマクロでムリヤリ作っちゃいました

Boost.FunctionはPreprocessorを使って可変個の特殊化を一気に作ってますね
(おかげですごい読みにくい…)

あまりいい例ではないですけど、私が作ったfunctionはここにあります
http://d.hatena.ne.jp/faith_and_brave/20071031/1193831871

>「関数型テンプレートパラメータ」
んー、こういう書き方はBoost.Functionで初めてみたのでわかんないです(><)
2008/01/07 22:51 | アキラ

# re: C++ - boost::function はどのように可変長引数に対応しているのか

コメントにあったのはどうやらPreprocessorでの可変個の特殊化の詳細が知りたいようだったので

>BOOST_FUNCTION_PARMS
>BOOST_FUNCTION_ARGS
これは、Boostが提供しているマクロですが、Boost.Functionはこれらを使って可変個の特殊化を作成しています

私はたぶん同様のことを以下のようにして行いました

#define SHAND_TEMPLATE_PARAMS_1 class T0
#define SHAND_TEMPLATE_PARAMS_2 class T0, class T1
...

#define SHAND_TEMPLATE_ARGS_1 T0
#define SHAND_TEMPLATE_ARGS_2 T0, T1
...

#define SHAND_FUNCTION_PARAMS_1 T0 t0
#define SHAND_FUNCTION_PARAMS_2 T0 t0, T1 t1
...

#define SHAND_FUNCTION_ARGS_1 t0
#define SHAND_FUNCTION_ARGS_2 t0, t1
...

#define SHAND_FUNCTION_CLASS_N(Count) \
template <class R, SHAND_TEMPLATE_PARAMS_##Count##> \
class function<R (SHAND_TEMPLATE_ARGS_##Count##)> \
...


こういうマクロを作って
↓で一気に10個分のfunction作成
SHAND_FUNCTION_CLASS_N(1)
SHAND_FUNCTION_CLASS_N(2)
SHAND_FUNCTION_CLASS_N(3)
SHAND_FUNCTION_CLASS_N(4)
SHAND_FUNCTION_CLASS_N(5)
SHAND_FUNCTION_CLASS_N(6)
SHAND_FUNCTION_CLASS_N(7)
SHAND_FUNCTION_CLASS_N(8)
SHAND_FUNCTION_CLASS_N(9)
SHAND_FUNCTION_CLASS_N(10)
2008/01/07 23:02 | アキラ

# re: C++ - boost::function はどのように可変長引数に対応しているのか

>コメントにあったのはどうやらPreprocessorでの可変個の特殊化の詳細が知りたいようだったので

お~ぅ。確かにそっちかも。

>BOOST_FUNCTION_PARMS
>BOOST_FUNCTION_ARGS

で鬼読みにくくなってますよねぇ。
2008/01/07 23:32 | 囚人

# re: C++ - boost::function はどのように可変長引数に対応しているのか

>あまりいい例ではないですけど、私が作ったfunctionはここにあります
>http://d.hatena.ne.jp/faith_and_brave/20071031/1193831871

お~!相変わらずスゴイですね。
2008/01/08 0:01 | 囚人

# re: C++ - boost::function はどのように可変長引数に対応しているのか

いえいえ、古いコンパイラには非対応なので
Preprocessorさえ読み解けばなんとか作れますw
2008/01/08 0:13 | アキラ

# re: C++ - boost::function はどのように可変長引数に対応しているのか

やはり自分のプリプロセスの知識・解釈・技量不足
でしたかね・・・。

10個とはわかりませんでしたが、数の制限は
あるのではないかと推測してみていたので、
その裏付けとしてマクロを展開してみたのですが、

たとえばreturn (*f)(BOOST_FUNCTION_ARGS);は
return (*f)(BOOST_PP_CAT(BOOST_PP_REPEAT_, BOOST_PP_IIF(1 BOOST_PP_TUPLE_EAT_3(3, 0, BOOST_PP_NIL), BOOST_PP_NODE_1, BOOST_PP_NODE_3)(BOOST_PP_REPEAT_P))(BOOST_FUNCTION_NUM_ARGS, BOOST_PP_ENUM_PARAMS_M, a));

みたいにこれ以上展開できなくなったのでギブアップ。。
既に間違っている? レベル低いですよね。悲しい・・・
言い訳になるかもしれませんが、マクロは大嫌いです;
個人的にはインクルードや、pragmaとかのしょうがないものや、
インクルードガードとコンパイルのスィッチ
以外での目的で使わないで欲しいと思ってしまいます(ぇ。

>Visual C++ なら「/E」「/PE」「/EP」コンパイラオプションを使うと、プリプロセスした結果が得られる。

なるほど、これは知りませんでした!
いつもわかりにくいマクロは手動で展開して
見ていたのですが、
展開結果はそんなことをせずに見ることが出来るのですね;
後で調べてみようと思います。
展開後のコードでステップ実行も出来るとすごくうれしいのですけどw

それにしてもわざわざ解説して頂き、
どうもありがとうございました。
さすがにお二人ともめちゃくちゃ詳しいですね。
自分のまわりには自分よりC++がわかる人
って一人もいないのでとても勉強になります。
2008/01/10 17:22 | 通りすがり

# re: C++ - boost::function はどのように可変長引数に対応しているのか

>言い訳になるかもしれませんが、マクロは大嫌いです;
>個人的にはインクルードや、pragmaとかのしょうがないものや、
>インクルードガードとコンパイルのスィッチ
>以外での目的で使わないで欲しいと思ってしまいます(ぇ。

私も好きじゃないですねぇ。デバッグしててもわけがわかりませんもんね。


>さすがにお二人ともめちゃくちゃ詳しいですね。
>自分のまわりには自分よりC++がわかる人
>って一人もいないのでとても勉強になります。

アキラさんは明らかに(←ここかけてみた)すごいですが、私はまだまだ C++ 使いとは言えません。
C++ は難しいですねぇ。その分楽しいですけども。
2008/01/11 11:04 | 囚人

# re: C++ - boost::function はどのように可変長引数に対応しているのか

マクロは、コンパイルエラーがどこで出てるのかわからなくなるのでキライですね~
できれば使いたくない

>アキラさんは明らかに(←ここかけてみた)すごいですが
いえいえ、職場はともかくネット上には神レベルのひとがいっぱいいるので
ぼくなんてまだまだですよー

Boostのソースを読むとかなりのレベルアップになるのでお試しあれ(それを作るとさらにレベルアップ!)
2008/01/11 19:22 | アキラ

# Coroutine(4) | S.F.Page

Coroutine(4) | S.F.Page
2011/06/04 16:35 | Pingback/TrackBack

# Its like you learn my thoughts! You appear to know a lot about this, such as you wrote the e-book in it or something. I feel that you could do with a few % to pressure the message house a bit, but instead of that, this is wonderful blog. An excellent re

Its like you learn my thoughts! You appear to know a lot about this, such as you wrote the e-book in it or something.
I feel that you could do with a few % to pressure the message house a bit,
but instead of that, this is wonderful blog.
An excellent read. I'll definitely be back.

# I am really loving the theme/design of your website. Do you ever run into any browser compatibility problems? A number of my blog visitors have complained about my website not operating correctly in Explorer but looks great in Chrome. Do you have any id

I am really loving the theme/design of your website.
Do you ever run into any browser compatibility problems?

A number of my blog visitors have complained about my website not operating correctly in Explorer but looks
great in Chrome. Do you have any ideas to help fix this issue?

# Hello, Neat post. There is a problem with your web site in web explorer, may test this? IE still is the market chief and a large part of other folks will leave out your magnificent writing due to this problem.

Hello, Neat post. There is a problem with your
web site in web explorer, may test this? IE still is the market chief and a large part of other folks
will leave out your magnificent writing due to this problem.

# DYmpgaITpqzNsq

lkVZPY Im obliged for the blog.Really looking forward to read more. Keep writing.
2019/06/28 23:14 | https://www.suba.me/

# qwvOmTDnUJJSXItqdH

one of our visitors just lately recommended the following website

# eyORBQCcKvjP

You have made some good points there. I looked on the web to learn more about the issue and found most individuals will go along with your views on this website.

# nxnSPRJFfBY

Network Advertising is naturally quite well-known because it can earn you a great deal of dollars within a pretty short period of time..

# DSAZTubYnpgRDVT

Simply a smiling visitant here to share the love (:, btw outstanding layout.
2019/07/02 7:11 | https://www.elawoman.com/

# ikUltvkdeFLbfq

tarde sera je serais incapable avons enfin du les os du.

# RDgetKDMBJDwB

This website was how do I say it? Relevant!! Finally I ave found something that helped me. Thanks!
2019/07/07 19:44 | https://eubd.edu.ba/

# cXjoKAGSZrDGNStO

I\ ave been looking for something that does all those things you just mentioned. Can you recommend a good one?
2019/07/08 18:00 | http://bathescape.co.uk/

# hJoxyWRnvUq

This blog was how do I say it? Relevant!! Finally I ave found something which helped me. Many thanks!

# uFaZNAExmMMflwcJ

It as going to be end of mine day, except before ending I am reading this impressive piece of

# hYttbFWNkM

Well I sincerely enjoyed reading it. This subject procured by you is very constructive for accurate planning.

# BTqwqjTfnoGroY

What as up i am kavin, its my first occasion to commenting anywhere, when i read this paragraph i thought i could also make comment due to this sensible piece of writing.

# PPwcoAMDkUnPyPp

Well I truly liked reading it. This tip offered by you is very effective for proper planning.

# QqmjkCgDxPzgRCA

Major thankies for the article.Really looking forward to read more. Keep writing.

# SgUVpfwNrvzM

Your kindness will be drastically appreciated.

# JTndBgNKTHyismSqPqq

Incredible! This blog looks exactly like my old one! It as on a entirely different subject but it has pretty much the same layout and design. Outstanding choice of colors!

# LqWBNZdXfx

What as up to all, for the reason that I am truly keen of reading this website as post to be updated regularly. It carries good information.
2019/07/12 17:55 | https://www.vegus91.com/

# HQFcVAWDPaFOOFiEjWZ

What as up everyone, I am sure you will be enjoying here by watching these kinds of comical movies.

# RefyXNrNbOiPvvPxvOs

This web site truly has all of the information I wanted concerning this subject and didn at know who to ask.

# VDhxdjYnofEKWMEKtZ

Piece of writing writing is also a fun, if you know after that you can write if not it is difficult to write.

# gXuxRkXTZFeuO

Major thanks for the article post. Want more.

# cBkfWSyKLsvxuHyPGe

Just discovered this blog through Yahoo, what a way to brighten up my day!

# lRaQKZhHZb

to mine. Please blast me an email if interested.

# FqjuVOAzzUTXGy

scar treatment massage scar treatment melbourne scar treatment

# jDDaXvubDTlqfumlY

Wow! This could be one particular of the most helpful blogs We ave ever arrive across on this subject. Basically Excellent. I am also an expert in this topic therefore I can understand your effort.
2019/07/17 15:36 | http://vicomp3.com

# NRblfGACKJKdBeiOh

It's a shame you don't have a donate button! I'd certainly donate to this fantastic blog!

# qSjDjsRXZXQIIpUpcM

This page certainly has all of the information I needed concerning this subject and didn at know who to ask.

# HOTdFkTDUalotDa

I think this is a real great post. Really Great.

# hYDfYptSeunuIBtCUw

This site was how do I say it? Relevant!! Finally I ave found something which helped me. Cheers!

# ETFjlvbzwyw

I truly like your weblog put up. Preserve publishing a lot more beneficial data, we recognize it!

# SxfYNizrnBdtEFQG

the posts are too brief for novices. May you please lengthen them a little
2019/07/18 15:15 | http://tiny.cc/freeprins

# DDabXqqAAEUBccT

topic, made me personally consider it from numerous various

# cWtgFIPsjtPQZd

Muchos Gracias for your article post.Really looking forward to read more. Much obliged.

# NEFveKhdsM

Link exchange is nothing else but it is just placing the other person as blog link on your page at appropriate place and other person will also do same in favor of you.|
2019/07/23 8:13 | https://seovancouver.net/

# ASJEkGsvEHUzZMQ

Yeah bookmaking this wasn at a bad decision great post!.
2019/07/23 22:45 | https://issuu.com/AnabelleJones

# CdRttqkgMvEqD

Really informative article. Much obliged.

# EBCGpCbvuvSdmv

Thanks for another excellent article. Where else could anyone get that type of info in such an ideal way of writing? I have a presentation next week, and I am on the look for such information.

# fYmzhHSeBKpG

It is best to participate in a contest for among the finest blogs on the web. I all suggest this website!

# VzejlSSsLPtNnO

Thanks a lot for the article.Really looking forward to read more. Fantastic.

# ZXkpGEMLxWXhYqKpF

It as hard to come by educated people for this subject, however, you sound like you know what you are talking about! Thanks
2019/07/25 5:22 | https://seovancouver.net/

# TWmlbyaeNJmaWIXj

Its hard to find good help I am constantnly proclaiming that its difficult to procure good help, but here is

# IuGWmerQOIftutz

Wow! This could be one particular of the most useful blogs We ave ever arrive across on this subject. Basically Excellent. I am also an expert in this topic so I can understand your effort.

# Good day! I could have sworn I've visited this blog before but after looking at some of the posts I realized it's new to me. Anyhow, I'm definitely happy I stumbled upon it and I'll be book-marking it and checking back regularly!

Good day! I could have sworn I've visited this blog before but after looking at some of the
posts I realized it's new to me. Anyhow, I'm definitely happy I
stumbled upon it and I'll be book-marking it and checking back regularly!

# Good day! I could have sworn I've visited this blog before but after looking at some of the posts I realized it's new to me. Anyhow, I'm definitely happy I stumbled upon it and I'll be book-marking it and checking back regularly!

Good day! I could have sworn I've visited this blog before but after looking at some of the
posts I realized it's new to me. Anyhow, I'm definitely happy I
stumbled upon it and I'll be book-marking it and checking back regularly!

# Good day! I could have sworn I've visited this blog before but after looking at some of the posts I realized it's new to me. Anyhow, I'm definitely happy I stumbled upon it and I'll be book-marking it and checking back regularly!

Good day! I could have sworn I've visited this blog before but after looking at some of the
posts I realized it's new to me. Anyhow, I'm definitely happy I
stumbled upon it and I'll be book-marking it and checking back regularly!

# Good day! I could have sworn I've visited this blog before but after looking at some of the posts I realized it's new to me. Anyhow, I'm definitely happy I stumbled upon it and I'll be book-marking it and checking back regularly!

Good day! I could have sworn I've visited this blog before but after looking at some of the
posts I realized it's new to me. Anyhow, I'm definitely happy I
stumbled upon it and I'll be book-marking it and checking back regularly!

# PSiBpnRGxNJzSO

Major thankies for the post.Really looking forward to read more. Want more.

# XaHYBWxlUSSNgCM

very handful of internet sites that take place to become in depth beneath, from our point of view are undoubtedly well worth checking out

# MaAhurcNbAqbWo

These people work together with leap close to they will combined with the boots or shoes nevertheless search great. I truly do think they may be well worth the charge.

# JRpUUzTWvS

It as very straightforward to find out any topic on net as compared to textbooks, as I found this article at this site.

# lQcWvmhNGEvt

Thanks for the blog article.Thanks Again.
2019/07/26 17:21 | https://seovancouver.net/

# QoqWNDKVzxS

I really liked your article.Thanks Again. Fantastic.

# LFZmzaTZPqFLWpfC

You should participate in a contest for probably the greatest blogs on the web. I all recommend this web site!

# fOLbmALvicieaNQBS

Modular Kitchens have changed the idea of kitchen nowadays since it has provided household females with a comfortable yet an elegant place through which they may devote their quality time and space.

# QhYrXgTXoMhAY

That is a great tip especially to those fresh to the blogosphere. Brief but very accurate info Many thanks for sharing this one. A must read article!

# hkRulWHEhtxTPRO

I simply could not leave your web site before suggesting that I actually loved the usual information an individual provide on your guests? Is gonna be again ceaselessly to inspect new posts.

# DIBlQujMJMEmhdoUYgH

It as nearly impossible to find knowledgeable people about this topic, however, you sound like you know what you are talking about! Thanks

# UnlCUSSIbkEDufHYW

Very neat blog post.Really looking forward to read more. Want more.

# wcCzpiZYVYYrfoLwdB

Major thanks for the blog. Really Great.

# PvqfpdEhxctfSFzigSA

Vitamin E is another treatment that is best

# TsmyggjyOdxPfGlFso

Thanks for sharing, this is a fantastic article post.Really looking forward to read more. Really Great.

# BAEpkHUFvyvuhLNAXGy

Thanks-a-mundo for the blog article.Really looking forward to read more.
2019/07/27 11:53 | https://capread.com

# WzcWXxqiDOQ

I went over this internet site and I believe you have a lot of superb information, saved to bookmarks (:.

# qkBVrJKOOikKHBFPWo

Longchamp Pas Cher Why users still use to read news papers when in this technological world all is presented on net?

# kPXrEOBixIuiiIMXaE

You have made some good points there. I checked on the net to learn more about the issue and found most people will go along with your views on this web site.

# weWYmzINudd

You are not right. I am assured. I can prove it. Write to me in PM, we will talk.

# CsZtHwePfgvOrLKPO

It as not that I want to duplicate your web-site, but I really like the design. Could you let me know which theme are you using? Or was it especially designed?

# pIVDTQxrDMapRkZ

you could have a fantastic weblog right here! would you prefer to make some invite posts on my weblog?

# rGfKMheqcscDFgjjV

you have to post. Could you make a list the complete urls of all your public pages like your twitter feed, Facebook page or linkedin profile?

# nPgFiGBRAsPID

I truly appreciate this blog post.Really looking forward to read more. Really Great.

# zwrDmEedRjqgJnUV

This website was how do I say it? Relevant!! Finally I ave found something that helped me. Thanks a lot!

# abjsncfQELWFlrBoF

usually posts some very exciting stuff like this. If you are new to this site

# qsdRyxaUgxM

This website truly has all the information I wanted about this subject and didn at know who to ask.

# XputzLXoyNeqkyVWmx

The cheap jersey signed Flynn last year, due to the knee.

# hIJeIalKCkHseuC

Looking forward to reading more. Great blog post.Really looking forward to read more. Keep writing.

# YtCYyzxSVG

Most of these new kitchen instruments can be stop due to the hard plastic covered train as motor. Each of them have their particular appropriate parts.

# tmRXmiwYYNMlWCqYY

Thanks-a-mundo for the blog article.Thanks Again. Keep writing.

# VmQpKVJXkTTujayLajy

Your method of telling the whole thing in this article is actually pleasant, all be able to effortlessly understand it, Thanks a lot.

# dlnuBUaTOwEHCm

Merely wanna state that this really is really helpful , Thanks for taking your time to write this.

# JbZVAKmaajkfOG

Im obliged for the post.Really looking forward to read more. Want more.

# WFYzXgpBkPeXz

Major thanks for the blog article. Keep writing.

# nEeXvJEXYrzF

magnificent points altogether, you just won a logo new reader. What might you suggest in regards to your submit that you made some days ago? Any sure?

# DnJmtahjLm

Thanks-a-mundo for the article post.Really looking forward to read more. Keep writing.

# CBJPEzSkgY

My brother suggested I might like this blog. He was entirely right. This post actually made my day. You cann at imagine just how much time I had spent for this information! Thanks!

# beFsMFmdNLBDSls

uvb treatment There are a lot of blogging sites dedicated to celebrities (ex. Perez Hilton), love, fashion, travel, and food. But, how do I start one of my own specialty?.

# YNxoOneZeXvY

Very good write-up. I definitely appreciate this website. Thanks!

# kATjKnGaov

It as fantastic that you are getting ideas from this paragraph as well as from our dialogue made here.

# NSsiQOumhRLAjHLmORd

Some genuinely good information, Gladiolus I noticed this.

# leLVzGULrDDimnFDW

This web site really has all the info I needed about this subject and didn at know who to ask.

# cUyeRUwVsNvZDQlMILs

You ave got the most impressive webpages.|

# ZwvpygrZmZ

The Birch of the Shadow I feel there may become a several duplicates, but an exceedingly helpful list! I have tweeted this. Quite a few thanks for sharing!

# eXwsOZeKKNsCztQSlGH

Utterly written articles , appreciate it for selective information.

# YnvIkbDuhvHxfDCjHM

You have brought up a very superb points , appreciate it for the post.

# wmbCNSOgJLdrrisX

I want looking through and I conceive this website got some truly useful stuff on it!.

# vuByszIChA

Just wanted to say thanks for posting this!

# OksIWCRFSmXTa

There is obviously a lot to realize about this. I assume you made various good points in features also.

# ByyXtnaAkXDLAEJ

Wow, this paragraph is fastidious, my sister is analyzing such things, thus I am going to convey her.

# PBsSxSKcQlxyS

You should not clone the girl as start looking specifically. You should contain the girl as design, yet with your own individual distinct distort.

# aDuPrgigKcp

Thanks again for the blog post.Really looking forward to read more. Want more.

# arEisBAVWux

Very polite guide and superb articles, very miniature as well we need.

# pIUekOBCrG

Woah! I am really loving the template/theme of this blog.

# IhfZAVCTYuswjT

I think other website proprietors should take this website as an model, very clean and magnificent user genial style and design, let alone the content. You are an expert in this topic!

# qoEmoYzTyKFG

We stumbled over here from a different website and thought I might check things out. I like what I see so now i am following you. Look forward to looking into your web page repeatedly.

# hukmZtBZhVDjPNfF

This blog is definitely cool as well as factual. I have discovered helluva useful advices out of it. I ad love to go back every once in a while. Thanks a bunch!
2019/08/07 3:05 | https://issuu.com/yandex5948

# vyEPUtcEspZzjgYX

Just to let you know your web page looks a little bit unusual in Safari on my notebook with Linux.
2019/08/07 5:01 | https://seovancouver.net/

# PIEKzsMZFOTJ

magnificent issues altogether, you just won a brand new reader. What might you suggest in regards to your publish that you just made a few days in the past? Any certain?

# ycbnIhPWbkTQ

It as great that you are getting ideas from this paragraph as well as from our discussion made here.|

# luPrpAQTDnVLVjkM

Really appreciate you sharing this article.Thanks Again. Awesome.
2019/08/07 14:02 | https://www.bookmaker-toto.com

# RMRRISxlhmf

Im obliged for the article post.Thanks Again. Fantastic.
2019/08/07 16:04 | https://seovancouver.net/

# IEeRihtksrJqaLA

My brother suggested I might like this website. He was entirely right. This post actually made my day. You can not imagine simply how much time I had spent for this information! Thanks!

# ziSYAsKlveFlCaQe

The Silent Shard This can most likely be very practical for a few of the positions I decide to do not only with my website but

# trDvYxhUBYxSunIe

Regards for helping out, fantastic information. It does not do to dwell on dreams and forget to live. by J. K. Rowling.

# FPEEIMyppaaOBgArqnj

I'а?ve learn several excellent stuff here. Definitely worth bookmarking for revisiting. I surprise how so much effort you place to create such a magnificent informative web site.

# PcyvHTuUsysRejXnSY

Wonderful article! We are linking to this great article on our site. Keep up the good writing.
2019/08/08 18:45 | https://seovancouver.net/

# YsbHDaavDwiWG

Thanks, I ave recently been hunting for information about this subject matter for ages and yours is the best I ave found so far.
2019/08/08 20:46 | https://seovancouver.net/

# wdJEVeMviq

This actually answered my own problem, thank an individual!
2019/08/08 22:46 | https://seovancouver.net/

# XXYgZwtXQM

This blog is no doubt awesome additionally factual. I have found helluva helpful advices out of it. I ad love to visit it again soon. Thanks a bunch!

# RbtZeCQWVbdbNOFjIeT

Thanks-a-mundo for the article post.Much thanks again. Want more.

# SdSAlIYABP

this yyour bbroadcast providd vivid clear idea
2019/08/12 21:59 | https://seovancouver.net/

# hIiSDWiKtDErkcW

Thanks a lot for sharing this with all of us you really know what you are talking about! Bookmarked. Kindly also visit my web site =). We could have a link exchange arrangement between us!

# AKelyjZekRZpZNAp

I think this is a real great post.Really looking forward to read more. Really Great.
2019/08/13 2:04 | https://seovancouver.net/

# ppaOiJeDNqhiEwF

Wow! This could be one particular of the most useful blogs We ave ever arrive across on this subject. Actually Great. I am also an expert in this topic therefore I can understand your hard work.
2019/08/13 4:12 | https://seovancouver.net/

# bQrycgGHBuSe

Just wanna admit that this is very beneficial , Thanks for taking your time to write this.
2019/08/13 8:10 | https://dribbble.com/Untly1943

# whBXIwYqvyH

You have made some really good points there. I looked on the net to learn more about the issue and found most individuals will go along with your views on this website.

# kzpCmNqmGcNsmTpSQcg

There is perceptibly a bundle to realize about this. I assume you made certain good points in features also.

# vxcUoLmHkJp

Magnificent site. A lot of helpful information here. I'а?m sending it to several friends ans also sharing in delicious. And obviously, thanks for your effort!

# yatVZrWoUpqjdbz

Really appreciate you sharing this article.Thanks Again. Want more.

# UPnsXCqBRoQzVBBBZFe

You are my inhalation, I have few blogs and infrequently run out from brand . Actions lie louder than words. by Carolyn Wells.

# UzlsoalYYrdYptC

This site was how do I say it? Relevant!! Finally I ave found something which helped me. Kudos!

# AHzrDMZuernj

This is a really good tip especially to those new to the blogosphere. Brief but very accurate information Appreciate your sharing this one. A must read article!
2019/08/20 6:46 | https://imessagepcapp.com/

# WToqpHYTCcyIsUtfYT

Thanks so much for the blog post.Much thanks again. Fantastic.

# SmvOhDBXQBOoraqZz

Wonderful blog! I found it while browsing on Yahoo News. Do you have any suggestions on how to get listed in Yahoo News? I ave been trying for a while but I never seem to get there! Many thanks

# hCoLyQHiOMDAra

pretty handy stuff, overall I believe this is worth a bookmark, thanks

# tHojOVTHzMDjPt

There is noticeably a bundle to realize about this. I consider you made various good points in features also.

# HRpCuNcfgeYFxqORRLy

It'а?s really a great and useful piece of info. I am satisfied that you simply shared this useful info with us. Please keep us informed like this. Thanks for sharing.

# zKTUlVtzUuPhRJhmm

Wow, what a video it is! Actually fastidious feature video, the lesson given in this video is actually informative.

# TwLGYZmUra

Outstanding post, you have pointed out some great points, I too conceive this s a very great website.

# MgyfJpsnxVsC

Some really fantastic content on this website , thanks for contribution.

# MZFwqvSycdmLGNgjJFW

Or maybe a representative speaking on behalf of the American University,

# oQSQTHGIrj

Some really good blog posts on this website , regards for contribution.

# lUSigPsvgXMnwDJymWa

Wonderful site. A lot of helpful info here.
2019/08/27 5:05 | http://gamejoker123.org/

# OsZcReSkbg

Thanks for sharing this first-class article. Very inspiring! (as always, btw)

# mpkjXhCdHDIoCQz

Wow, incredible blog layout! How long have you been blogging for? you made blogging look easy. The overall look of your website is fantastic, let alone the content!

# vySOcGnQhMMKUsApx

Thanks for the article post.Much thanks again. Awesome.

# bDwsWEApfAfhOf

In it something is. Many thanks for an explanation, now I will not commit such error.

# tlBkjpjFfdVa

Lovely blog! I am loving it!! Will come back again. I am taking your feeds also.

# OewYbEUnBmAMCPZCumO

Outstanding story there. What occurred after? Thanks!
2019/08/29 6:04 | https://www.movieflix.ws

# uxOdgTqHnNVcalc

problems? A number of my blog visitors have complained about my website not working correctly in Explorer but looks great in Opera.

# GNqgtCHbBLkklKw

Writing like yours inspires me to gain more knowledge on this subject. I appreciate how well you have stated your views within this informational venue.

# OgKDEoUQXbUUAUzrD

In my opinion you commit an error. Let as discuss. Write to me in PM, we will communicate.

# bxhXzmTMOvfRAFuXWGO

I really liked your post.Thanks Again. Want more.

# hGqDagvKuCATpf

Wow, great article post.Thanks Again. Really Great.

# rWfulstymAB

Inspiring story there. What happened after? Thanks!

# awvtVmCGxxpw

I truly appreciate this article post.Really looking forward to read more. Fantastic.

# oMJsWdGjDhmNCHQACLb

This page definitely has all the info I needed about this subject and didn at know who to ask.

# sHXOzSuHhAA

Thanks for any other fantastic post. Where else may just anybody get that type of info in such a perfect method of writing? I have a presentation next week, and I am at the look for such information.

# hOWJaayXcEBx

Spot on with this write-up, I absolutely feel this web site needs a

# RYwBCiXdBKiV

Some really excellent posts on this site, regards for contribution.

# jKJbaAWtvuhEA

Perfectly written subject material, Really enjoyed examining.
2019/09/10 3:50 | https://thebulkguys.com

# cNBxAZulfHoumZOLZa

Perfectly indited written content , thankyou for entropy.

# HqvTwwmxmx

Im obliged for the blog post.Really looking forward to read more. Really Great.
2019/09/10 22:30 | http://downloadappsapks.com

# PGsRQxmHJUtpjqDDxf

While I was surfing yesterday I saw a excellent post concerning
2019/09/11 1:00 | http://freedownloadpcapps.com

# clPItOKXhLNpUfEh

lushacre.com.sg I want to start a blog but would like to own the domain. Any ideas how to go about this?.
2019/09/11 11:23 | http://downloadappsfull.com

# AVCqvZZTscDwxQ

maybe you would have some experience with something like this.
2019/09/11 13:46 | http://windowsapkdownload.com

# hqJwkZsGwOHTrftDp

Your style is so unique in comparison to other people I ave read stuff from. Thanks for posting when you ave got the opportunity, Guess I will just book mark this blog.

# WDKASLEXoXHQsrMNzM

You created some decent points there. I looked on line for that concern and located most of the people will go coupled with with all of your web site.

# VZZJAFvAUetKDzRgPeO

You made some respectable points there. I looked on the internet for the difficulty and found most individuals will go together with together with your website.

# bGKCMBSrSbSbVDrP

You are my breathing in, I own few blogs and occasionally run out from to post.

# IPEFmYFTLxTVJidrbDm

Wow! This blog looks just like my old one! It as on a completely different topic but it has pretty much the same layout and design. Outstanding choice of colors!

# hrJEKijiQQ

Pretty! This has been a really wonderful post. Many thanks for providing these details.

# pNDFUynxDBCsGw

Loving the info on this site, you have done outstanding job on the blog posts.

# XxNcbnQjoytdlwpld

This is a really good tip particularly to those fresh to the blogosphere. Simple but very accurate info Appreciate your sharing this one. A must read article!
2019/09/13 21:55 | https://seovancouver.net

# wgBTUhjjtRjT

Well I definitely liked studying it. This tip offered by you is very useful for accurate planning.

# KEFEVPPrFaASHf

Looking forward to reading more. Great article post.Thanks Again. Fantastic.

# JntsBUYYGTAbdTlZDQ

Wow, wonderful blog layout! How long have you been blogging for? you made blogging look easy. The overall look of your web site is great, as well as the content!

# nbiutOZznmGrdXoQo

This awesome blog is no doubt awesome additionally informative. I have chosen helluva helpful things out of this amazing blog. I ad love to go back again soon. Cheers!

# eSUiUSAQUemFNzV

I think this is a real great blog article. Really Great.
2019/09/15 16:40 | https://vimeo.com/AlannaBurkes

# XdGgVyHyNcHATpUJ

Really appreciate you sharing this article post.Much thanks again. Awesome.

# jzUmlWHjwxFSqkug

This website has lots of extremely useful info on it. Thanks for sharing it with me!

# RGThitXHOcXne

Perfectly composed content material , regards for entropy.

# ywmLUqzLoo

Modular Kitchens have changed the idea of kitchen in today as world as it has provided household women with a comfortable yet a classy area through which they could spend their quality time and space.

# Illikebuisse gvimq

sulfur effects on body https://pharmaceptica.com/
2021/07/04 13:25 | pharmaceptica.com

# re: C++ - boost::function ????????????????????

cloroquin https://chloroquineorigin.com/# hydroxychloriqine
2021/07/18 13:25 | hydroxychloroquine eye

# re: C++ - boost::function ????????????????????

side effects of chloroquine https://chloroquineorigin.com/# hydrocyhloroquine

# ivermectin 18mg

stromectol order http://stromectolfive.online# ivermectin 12 mg
2021/09/28 11:58 | MarvinLic

# ivermectin 90 mg

ivermectin https://stromectolivermectin19.com/# cost of ivermectin pill
ivermectin cream canada cost
2021/11/02 2:15 | DelbertBup

# ivermectin otc

ivermectin 3mg tablets price https://stromectolivermectin19.com/# ivermectin oral 0 8
ivermectin lotion price
2021/11/03 23:58 | DelbertBup

# werxknrmoqth

https://hydrochloroquine200.com/ buy hydroxychloroquine
2021/11/26 23:26 | dwedayfhdd

# sildenafil citrate tablets 100 mg

http://viasild24.com/# how many sildenafil 20mg can i take
2021/12/07 14:52 | JamesDat

# careprost bimatoprost for sale

http://baricitinibrx.com/ baricitinib price
2021/12/12 11:49 | Travislyday

# careprost bimatoprost ophthalmic best price

http://bimatoprostrx.online/ bimatoprost generic best price
2021/12/13 7:36 | Travislyday

# buy careprost in the usa free shipping

http://baricitinibrx.online/ barikind
2021/12/14 3:25 | Travislyday

# bimatoprost ophthalmic solution careprost

https://baricitinibrx.com/ baricitinib eua fact sheet
2021/12/15 16:15 | Travislyday

# bimatoprost buy

https://bimatoprostrx.com/ best place to buy careprost
2021/12/16 11:45 | Travislyday

# stromectol 3 mg tablets price

djqztl https://stromectolr.com ivermectin oral 0 8
2021/12/17 9:02 | Eliastib

# ivermectin ebay

ersqsq https://stromectolr.com stromectol for humans
2021/12/19 4:15 | Eliastib

# YrFYifgMVXkosztVzj

http://imrdsoacha.gov.co/silvitra-120mg-qrms
2022/04/19 9:59 | johnansog

# plaquenil 200mg

http://www.hydroxychloroquinex.com/# chloroquine phosphate 500 mg
2022/12/31 2:21 | MorrisReaks

# How are food allergies and intolerances diagnosed, and what are the most effective management strategies stromectol 3 mg tablet

https://ummalife.com/post/520720 covimectin 12 tablet
2024/11/11 14:12 | iverheal 12 uses

コメントの投稿

タイトル
名前
URL
コメント